Nginx upstreams — балансировка нагрузки

Для Nginx балансировка нагрузки является основной задачей Nginx наряду с кэшированием и отдачей статики, это позволяет эффективно использовать его для нагруженных проектов. Через Nginx может работать почта, он применяется в кластерах веб-серверов с Apache и приложениями на Python и Ruby.



Nginx балансировка нагрузки и распределение нагрузки

Минимальный конфигурационный файл Nginx выглядит так (описание процесса настройки с нуля):


server {
listen *:80;

server_name example.com;
access_log /var/log/nginx/access.log;

location / {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_connect_timeout 120;
proxy_send_timeout 120;
proxy_read_timeout 180;
}
}



Балансировка между несколькими несколькими серверами или апстриами делается за счет добавления в начало файла дополнительного блока:

upstream backend {

server example.com;
server backend1.example.com weight=3;
server backend2.example.com:8080;
server backup3.example.com:8080 backup;
}



Подробная информация содержится в документации Nginx

Nginx балансировка нагрузки


В качестве server в основной части конфигурационного файла задан proxy_pass на порт 8080 локального хоста — также может указываться Unix сокет или имя сайта, на которое нужно направлять запросы.


Если указано несколько значений директивы — запросы при этом будут распределяться поровну или в указанных (при помощи задания веса) пропорциях:



Другие апстримы в примере:

server backend1.example.com weight=3;

Для backend1.example.com задан вес 3 одного из «серверов» — это означает, что на него будет направляться в 3 раза больше запросов.


server backend2.example.com:8080;

При выборе этого апстирма обращения будут происходить по hostname на порт 8080.


server backup3.example.com:8080 backup;

server backup будет использован только в случае если запросы отправить на первые три из указанных серверов невозможно.



 
Можно ограничить количество попыток обращения к апстиму Nginx в случае если ответа нет

В конфигурационном файле:

server backend2.example.com:8080 max-fails=2 fail_timeout=30s;



Если запрос не вернет код ответа 200 в течение 30 секунд, обращение произойдет вновь. Еще через 30 секунд Nginx посчитает сервер недоступным и исключит его из списка машин, которые можно использовать.

Балансировка Nginx осуществляется очень просто и эффективно. Типичная роль Nginx в любой архитектуре — фронтэнд, он успешно работает с любым приложением и успешно справляется с распределением запросов делая это очень быстро.



Альтернативой является специализированное решение для балансировки — HAPROXY