Настройка кластерного веб-сервера с помощью Varnish и Nginx на Ubuntu 13.10

Вступление

Что такое кластерный веб-сервер?

Кластерный веб-сервер – это метод, используемый в веб-хостинге, позволяющий распределить нагрузку между несколькими машинами или «нодами». Цель этого метода заключается в устранении единых точек отказа, обеспечении безотказной работы, и, как следствие, повышении доступности веб-сайта. Характерно, что веб-кластеры будут использовать несколько нод на бэкэнде и фронтэнде.

Кластеризация не требует больших вложений и ее очень легко настроить; в этом руководстве показано, как создать циклический (round robin) кластерный веб-сервер на основе двух нод с помощью Nginx и Varnish.

Что такое Varnish?

Varnish – это HTTP-ускоритель; другими словами, это кэш-сервер. Он ускоряет веб-сайты, существенно разгружает сервер, кэшируя как статический, так и динамический контент.

Что такое Nginx?

Nginx – это легкий сервер с высокой производительностью, который часто используется как бэкэнд Varnish. Он не обслуживает веб-сайты напрямую; он будет отвечать на запросы Varnish тогда, когда нужно построить кэш.

Требования

Для выполнения данного руководства понадобятся 3 сервера, не менее 512 мегабайт каждый.

Рекомендуется назвать хосты следующим образом:

  • varnish
  • nginx01
  • nginx02

Разумеется, можно добавить любое количество серверов “nginx–“, но в данном руководстве используется 2 таких сервера.

На трех только что созданных экземплярах выполните следующую команду:

sudo apt-get update

1: Установка Nginx

Примечание: Пропустите этот шаг для сервера varnish.

Nginx будет отвечать за обслуживание веб-сайта для Varnish.

Данный процесс нужно выполнить на всех серверах Nginx (в данном случае это nginx01 и nginx02).

Рекомендуется устанавливать Nginx из исходного кода, что гарантирует использование самой последней версии программы.

У Nginx есть две основные зависимости: библиотека PCRE (Perl compatible regular expression) и zlib (библиотека сжатия). Последние версии на момент написания статьи:

  • Nginx: 1.4.4
  • PCRE: 8.34
  • zlib: 1.2.8

Теперь нужно загрузить исходный код, а затем извлечь и скомпилировать его; введите по отдельности все нижеприведенные команды:

wget http://nginx.org/download/nginx-1.4.4.tar.gz
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.34.tar.gz
wget http://zlib.net/zlib-1.2.8.tar.gz
tar -zxvf nginx-1.4.4.tar.gz
tar -zxvf pcre-8.34.tar.gz
tar -zxvf zlib-1.2.8.tar.gz

Прежде чем собирать Nginx, нужно получить программу Make и компилятор исходного кода C++ под названием “‘g++”, который будет отвечать за выполнение всех команд, необходимых для компиляции Nginx. Это можно сделать с помощью apt-get.

sudo apt-get install make g++

На данном этапе можно приступать к сборке Nginx. Для начала перейдите в извлеченный каталог Nginx:

cd nginx-1.4.4

Затем нужно настроить параметры сборки для этого экземпляра:

./configure --with-pcre=../pcre-8.34 --with-zlib=../zlib-1.2.8

Далее создайте бинарные файлы Nginx:

make

В завершение установите Nginx:

sudo make install

2: Установка Varnish

Varnish будет отвечать за обслуживание сайта для посетителей.

Все, что нужно сделать, – установить программу на сервер varnish.

Сначала нужно получить GPG-ключ, который открывает доступ к репозиторию Varnish. Его можно загрузить, выполнив команду:

wget http://repo.varnish-cache.org/debian/GPG-key.txt

Затем установите ключ:

sudo apt-key add GPG-key.txt

Далее нужно внести список репозитория Varnish в список исходных кодов сервера:

echo "deb http://repo.varnish-cache.org/ubuntu/ precise varnish-3.0" | sudo tee -a /etc/apt/sources.list

Затем нужно убедиться, что apt-get сможет найти пакеты Varnish; для этого обновите apt-get:

sudo apt-get update

В завершение установите Varnish:

sudo apt-get install varnish

На данном этапе серверы Nginx и Varnish готовы к настройке.

3: Настройка Nginx

Настройки Nginx не требуют серьезных изменений; для выполнения данного руководства подойдут и настройки по умолчанию. Тем не менее, рекомендуется все же отредактировать страницу “Welcome to nginx”, чтобы указать, какой из VPS обслуживает страницы для Varnish.

Перейдите в каталог root html, в котором находится нужная страница Nginx:

cd /usr/local/nginx/html/

Затем отредактируйте index.html:

vim index.html

Отредактируйте файл таким образом:

nginx01:

<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>I am nginx01</p>

nginx02:

<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>I am nginx02</p>

Теперь запустите Nginx.

Примечание: если команда не выводит никакого результата – она выполнена верно.

sudo /usr/local/nginx/sbin/nginx

4: Настройка Varnish

Для начала нужно настроить Varnish на порт 80. Для этого отредактируйте конфигурационный файл Varnish по умолчанию. Перейдите в каталог, содержащий этот файл:

cd /etc/default

Теперь откройте файл varnish:

sudo vim varnish

Внесите в данный файл следующий блок кода:

## Alternative 2, Configuration with VCL
#
# Listen on port 6081, administration on localhost:6082, and forward to
# one content server selected by the vcl file, based on the request.  Use a 1GB
# fixed-size cache file.
#
DAEMON_OPTS="-a :6081 \
-T localhost:6082 \
-f /etc/varnish/default.vcl \
-S /etc/varnish/secret \
-s malloc,256m"

Отредактируйте его следующим образом:

## Alternative 2, Configuration with VCL
#
# Listen on port 6081, administration on localhost:6082, and forward to
# one content server selected by the vcl file, based on the request.  Use a 1GB
# fixed-size cache file.
#
DAEMON_OPTS="-a :80 \
-T localhost:6082 \
-f /etc/varnish/default.vcl \
-S /etc/varnish/secret \
-s malloc,256m"

Затем нужно настроить балансировщик нагрузки. Перейдите в каталог, в котором находится скрипт конфигурации Varnish:

cd /etc/varnish

Откройте файл default.vcl:

sudo vim default.vcl

Нужно удалить блок кода backend default, который выглядит так:

backend default {
.host = "127.0.0.1";
.port = "8080";
}

Замените его следующим блоком. Убедитесь, что значение .host изменено соответствующим образом (внесите общедоступный или закрытый IP):

# define our first nginx server
backend nginx01 {
.host = "192.168.0.100";
.port = "80";
}
# define our second nginx server
backend nginx02 {
.host = "192.168.0.101";
.port = "80";
}
# configure the load balancer
director nginx round-robin {
{ .backend = nginx01; }
{ .backend = nginx02; }
}
# When a request is made set the backend to the round-robin director named nginx
sub vcl_recv {
set req.backend = nginx;
}

5: Тестирование

Проверьте, можно ли получить доступ к сайту через сервер Varnish. Укажите общедоступный IP сервера varnish и перейдите к нему в браузере. Все работает верно, если появился такой текст:

Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
I am nginx01
For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.
Thank you for using nginx.

Можно также проверить, остается ли сайт доступным в сети, выключив Nginx на том сервере, на котором Nginx должен обслуживать Varnish. В данном случае это сервер nginx01:

/usr/local/nginx/sbin -s stop

Снова введите общедоступный IP сервера Varnish. Только что выключенный VPS все еще будет виден за счет кэширования Varnish. По истечении кэша первого сервера можно будет увидеть, что контент обслуживается сервером nginx02.

Чтобы очистить кэш Varnish, перезапустите сервис:

sudo service varnish restart

Итоги

Теперь round robin кластерный веб-сервер Varnish полностью настроен и может обслуживать контент сайта. Для дальнейшей настройки Nginx читайте “Установка Linux, nginx, MySQL, PHP (LEMP stack) на сервер Ubuntu 12.04“.

Tags: , , , , ,

1 комментарий

  • Александр says:

    После прочтения статьи остался несколько вопросов. На обоих nginx (nginx01 и nginx02) должна быть идентичная копия сайта? Или же в случае нескольких сайтов можно сделать так, чтобы один сайт на одном nginx, один на другом, а балансировщик (varnish) всё разрулит? В случае же идентичной копии как это всё лучше реализовать? Если с файлами понятно, то что делать с бд? Отдельный сервер или же делать репликацию? Не будет ли каких либо конфликтов в случае, если два сервера бекэнда различаются по мощности?

Добавить комментарий для Александр Отменить ответ