Имеется четыре сервера:
192.168.1.107 – NFS-сервер, на котором находятся файлы “приложения”;
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