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

Apr 7, 2016 21:48 · 387 words · 2 minute read nginx

Механизм распределения входящего трафика на несколько серверов называется балансировкой нагрузки. Давайте разберемся, как с помощью 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, дополнительные примеры можно найти на сайте разработчиков.

tweet Share