Для Nginx балансировка нагрузки является основной задачей Nginx наряду с кэшированием и отдачей статики, это позволяет эффективно использовать его для нагруженных проектов. Через Nginx может работать почта, он применяется в кластерах веб-серверов с Apache и приложениями на Python и Ruby.
Минимальный конфигурационный файл 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;
}
}
Балансировка нагрузки в Nginx
Балансировка между несколькими несколькими серверами или апстримами делается за счет добавления в начало файла дополнительного блока:
upstream backend { server example.com; server backend1.example.com weight=3; server backend2.example.com:8080; server backup3.example.com:8080 backup; }
Подробная информация содержится в документации 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 при балансировке нагрузки
Можно ограничить количество попыток обращения к апстиму Nginx в случае если ответа нет
В конфигурационном файле:
server backend2.example.com:8080 max-fails=2 fail_timeout=30s;
Если запрос не вернет код ответа 200 в течение 30 секунд, обращение произойдет вновь. Еще через 30 секунд Nginx посчитает сервер недоступным и исключит его из списка машин, которые можно использовать.
Балансировка нагрузки Nginx осуществляется очень просто и эффективно. Роль Nginx в любой архитектуре — фронтэнд, он успешно работает с любым приложением и успешно справляется с распределением запросов делая это очень быстро.
Альтернативой является специализированное решение для балансировки — HAPROXY