БАЛАНСИРОВКА НАГРУЗКИ NGINX

**Что такое балансировка нагрузки?**
Балансировка нагрузки – это полезный механизм распределения входящего трафика на несколько доступных виртуальных серверов. При таком распределении обработки трафика повышается отказоустойчивость, стабильность и продуктивность приложений. Циклический алгоритм для балансировки нагрузки (Round Robin) пересылает посетителей на один из множества IP-адресов. На самом базовом уровне round robin (довольно простой в использовании) распределяет нагрузку на сервер с учетом более тонких факторов (как время отклика сервера и географического региона посетителей).

**Требования**
Для выполнения данного руководства необходимо иметь пользователя с привилегиями root. Чтобы узнать, как создать такую учетную запись, читайте руководство «Добавление и удаление пользователей на Ubuntu 12.04 и CentOS 6».

Прежде чем приступить к настройке балансировки нагрузки Nginx, нужно установить сам веб-сервер Nginx. Это можно очень быстро сделать при помощи apt-get:

*sudo apt-get install nginx*

**Модуль Upstream**
В целях создания цикличной системы балансировки нагрузки нужно использовать модуль Nginx под названием Upstream (для этого нужно включить соответствующие конфигурации в настройки Nginx).

Итак, откройте конфигурации сайта (в данном руководстве используется виртуальный хост по умолчанию):

*nano /etc/nginx/sites-available/default*

В данный файл необходимо добавить конфигурации балансировки нагрузки.

Для начала внесите модуль upstream, что выглядит так:

*upstream backend

{ server backend1.example.com;

server backend2.example.com;

server backend3.example.com; }*

Затем нужно сослаться на модуль в конфигурации:

*server { location / { proxy\_pass http://backend; } }* После этого перезапустите nginx:

*sudo service nginx restart*

Обратите внимание: как только все виртуальные выделенные серверы готовы, балансировщик нагрузки должен начать распределять посетителей этих серверов.

**Директивы**
Предыдущий раздел показал, как равномерно распределить нагрузку между несколькими виртуальными серверами. Тем не менее, есть много причин, согласно которым на данный момент это не наиболее эффективный способ работы с данными. Чтобы сайт работал более продуктивно, а его посетители быстро распределялись между серверами, нужно использовать определенные директивы.

**Удельный вес**
Один из способов более точно распределить пользователей серверов – это установить удельный вес (по количеству клиентов) для некоторых машин. Nginx позволяет установить число, определяющее долю трафика, которая должна направляться на каждый сервер.

Настройка балансировки нагрузки, которая включает удельный вес сервера, может выглядеть следующим образом:

*upstream backend { server backend1.example.com weight=1; server backend2.example.com weight=2; server backend3.example.com weight=4; }*

Значение удельного веса по умолчанию – 1. Сервер со значением 2 (backend2.example) будет получать вдвое больше трафика, чем сервер со значением 1 (backend1 в данном коде); соответственно, сервер backend3 со значением веса 4 будет получать вдвое больше трафика, чем сервер backend2 и вчетверо больше сервера backend1.

**Хэш** IP хэш (IP hash) позволяет серверам отвечать на запросы клиентов в соответствии с их IP-адресом, направляя посетителя на один и тот же VPS каждый раз, когда он открывает сайт (если только этот сервер не выключен). Если сервер отключен, он должен быть соответствующим образом отмечен. Все IP-адреса, которые должны были направиться на отключенный сервер, в результате направляются на другую машину.

Пример таких конфигураций:

*upstream backend {

ip\_hash;

server backend1.example.com;

server backend2.example.com;

server backend3.example.com down;

}*

**Директива max\_fails** Согласно настройкам round robin по умолчанию, Nginx будет продолжать передавать данные на виртуальные выделенные серверы, даже если серверы не отвечают. Директива max\_fails (максимальное количество неудачных попыток) может автоматически предотвратить такое поведение, признавая не отвечающие серверы неработоспособными в течение определенного времени.

Директива max\_fails связана с двумя факторами: max\_fails и fall\_timeout. Max\_fails указывает максимальное количество неудачных попыток подключения к серверу, которые должны произойти для того, чтобы сервер считался неактивным. Fall\_timeout задает определенный интервал времени, в течение которого сервер считается неработоспособным. Как только это время истечет, попытки установить связь с сервером возобновятся. Значение fall\_timeout по умолчанию составляет 10 секунд.

Конфигурации могут выглядеть так:

*upstream backend {

server backend1.example.com max\_fails=3 fail\_timeout=15s;

server backend2.example.com weight=2;

server backend3.example.com weight=4;*