Балансировка нагрузки Nginx
Apr 7, 2016 21:48 · 387 words · 2 minute read
Механизм распределения входящего трафика на несколько серверов называется балансировкой нагрузки. Давайте разберемся, как с помощью Nginx в роли фронтенда настроить балансировку нагрузки между несколькими web-серверами Apache, выполняющих функции бекендов!
Для балансировки нагрузки используется циклический алгоритм, известный как Round Robin. Допустим, сайт размещается на трех серверах. Для описания такого «облака» серверов в конфигурации используется директива upstream
.
Примечание. Убедитесь, что в вашей конфигурации Nginx присутствует модуль ngx_http_upstream_module
.
В конфигурационном файле этот простейший пример может выглядеть следующим образом:
...
upstream backend {
server 192.168.0.11:8080;
server 192.168.0.12:8080;
server 192.168.0.13:8080;
}
...
Описанный таким образом бекенд из нескольких серверов далее можно использовать в качестве значения параметра proxy_pass
, например:
...
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
...
Однако равномерное распределение нагрузки между несколькими бекендами не всегда является наиболее эффективным решением. Один из способов регулировать нагрузку — установление [удельного] веса для серверов-бекендов, который определяет долю трафика, которая направляется на каждый сервер. Выглядит это следующим образом:
...
upstream backend {
server 192.168.0.11:8080 weight=2;
server 192.168.0.12:8080;
server 192.168.0.13:8080 weight=4;
}
...
В данном примере второй бекенд (192.168.0.12:8080) использует вес по умолчанию, который равен 1. Следовательно, первый бекенд (192.168.0.11:8080) с весом 2 будет получать вдвое больше трафика, чем второй бекенд (и вдвое меньше, чем третий бекенд с весом 4).
Для того, чтобы посетитель открывая сайт в браузере, направлялся на один и тот же сервер (если только сервер не выключен) используется директива ip_hash
. Пример конфигурации с использованием ip_hash
:
...
upstream backend {
ip_hash;
server 192.168.0.11:8080 weight=2;
server 192.168.0.12:8080;
server 192.168.0.13:8080 weight=4;
}
...
Если необходимо по каким-либо причинам вывести сервер из бекендов, можно использовать опцию down
:
...
upstream backend {
ip_hash;
server 192.168.0.11:8080 weight=2;
server 192.168.0.12:8080 down;
server 192.168.0.13:8080 weight=4;
}
...
Можно также определить максимально допустимое количество неудачных попыток подключения к серверу-бекенду, после которого сервер будет помечен как неработоспособный и запросы к нему прекратятся заданный промежуток времени. Делается это с помощью опций max_fails
и fail_timeout
:
...
upstream backend {
ip_hash;
server 192.168.0.11:8080 max_fails=5 fail_timeout=120;
server 192.168.0.12:8080 down;
server 192.168.0.13:8080 weight=4;
}
...
С помощью опции backup
можно задать резервный сервер, который начнет использоваться когда все основные сервера будут помечены как неработоспособные (или отключены с помощью опции down
):
...
upstream backend {
ip_hash;
server 192.168.0.11:8080 max_fails=5 fail_timeout=120;
server 192.168.0.12:8080 down;
server 192.168.0.13:8080 backup;
}
...
Это лишь краткий пример использования возможностей балансировки нагрузки Nginx, дополнительные примеры можно найти на сайте разработчиков.