NGINX: настройка простого load-balancing

Автор: | 13/10/2014

nginx_logoИмеется  четыре сервера:

192.168.1.107NFS-сервер, на котором находятся файлы “приложения”;

192.168.1.109 – “фронтенд” с NGINX, который будет балансером (принимать запросы от клиентов – и передавать их на два бекенда);

192.168.1.116 – “бекенд” №1 с NGINX, который будет обслуживать запросы к приложению;

192.168.1.117 – “бекенд” №2 с NGINX, который будет обслуживать запросы к  приложению.

Оба бекенда работают с одним приложением, которое находится на NFS-разделе.

Настройка выполняется не для реального приложения, просто стало интересно. Поэтому, в качестве “приложения” выступает один HTML-файлик:

# cat /mnt/nfs/share/index.html
Hello, NGINX

Для организации load-balancer-а в NGINX используется модуль ngx_http_upstream_module.

На фронтенде редактируем файл настроек хоста, в данном случае это /etc/nginx/conf.d/default.conf, и добавляем директиву upstream  с описанием наших бекендов:

upstream default {
    server 192.168.1.116:80;
    server 192.168.1.117:80;
}

И дальше, в блоке server{} редактируем location /:

    location / {
#        root   /usr/share/nginx/html;
        index  index.html index.htm;
        proxy_pass http://default;
    }

Проверяем, перезапускаем:

# nginx -t && service nginx restart
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Stopping nginx:                                            [  OK  ]
Starting nginx:                                            [  OK  ]

Файлы конфигурации на обоих бекендах выглядят одинаково:

# cat /etc/nginx/conf.d/default.conf | grep -v '#'
server {
    listen       80;
    server_name  localhost;

    location / {
        root /mnt/nfs/share;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

Теперь, например с сервера NFS, выполняем запрос к фронтенду:

 # curl http://192.168.1.109
Hello, NGINX

Всё работает, в логе есть записи:

192.168.1.107 - - [11/Oct/2014:17:55:40 +0300] "GET / HTTP/1.1" 200 13 "-" "curl/7.19.7 (i386-redhat-linux-gnu) libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18 libssh2/1.4.2" "-"

Такой балансировщик можно настраивать для любых сервисов – HTTP, HTTPS, FastCGI, uwsgi, SCGI, или Memcached.

К примеру, для FastCGI (NGINX + PHP-FPM) – вместо proxy_pass необходимо указать:

fastcgi_pass default;

Без указания протокола http://.

Что в такой схеме хочется изменить – запись логов.

В файл /etc/nginx/nginx.conf добавим новый лог-формат:

    log_format upstreamlog '[$time_local] $remote_addr $remote_user $server_name  '
                           'to: $upstream_addr: $request upstream_response_time '
                           '$upstream_response_time msec $msec request_time $request_time';

Создаём файл лога:

# touch /var/log/nginx/default-access.log

В описании default хоста – редактируем:

server {
    listen       80;
    server_name  localhost;

    ...
    access_log  /var/log/nginx/default-access.log  upstreamlog;

Проверяем, перезапускаем NGINX:

# nginx -t && service nginx restart
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Stopping nginx:                                            [  OK  ]
Starting nginx:                                            [  OK  ]

Снова запускаем curl, и смотрим лог:

# tail -f /var/log/nginx/default-access.log
[11/Oct/2014:18:12:58 +0300] 192.168.1.107 - localhost to: 192.168.1.116:80: GET / HTTP/1.1 upstream_response_time 0.014 msec 1413040378.519 request_time 0.014

Теперь видно, на какой бекенд был перенаправлен запрос.

Попробуем немного нагрузить фронтенд, и посмотрим на балансировку:

# ab -n 100 -c 10 http://192.168.1.109/

На фронеде – считаем:

# cat /var/log/nginx/default-access.log | grep "192.168.1.117" | wc -l
52
# cat /var/log/nginx/default-access.log | grep "192.168.1.116" | wc -l
52

Равномерно 🙂

Переменные upstream модуля можно найти тут>>>.

NGINX поддерживает несколько различных реализаций load-balance, см. ссылки ниже.

http://nginx.org
https://www.digitalocean.com