Настройка NGINX в режиме балансировки с равномерным распределением нагрузки

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

Из директив в upstream нам доступны:

server address [parameter]; - определяет серверы апстрима и их параметры (wight - вес сервера, max_conns - максимально количество подключений, max_fails - количество неудачных попыток, fail_timeout, backup, down)
hash key [consistent]; - в качестве key можно подставить $binary_remote_addr, consistent - для использования метода хэширования ketama вместо параметра по умолчанию, это значительно уменьшает количество ключей, которые переназначаются на другой вышестоящий сервер при изменении набора серверов
ip_hash; - испльзует для хэша только первые 3 октета IPv4 клиента, тоесть вся подсеть /24 будет висеть на одном upstream сервере. Не очень хорошее решение

рабочий конфиг будет такой:

/etc/nginx/nginx.conf — добавить в конец секции http чтобы при ошибках HTTP 5xx приложения перекидывало на следующий сервер:

http {
...
proxy_next_upstream http_500 http_502 http_503 http_504;
}

/etc/nginx/conf.d/service.conf:

upstream servicecluster {
 hash $binary_remote_addr consistent;
 server app-server1;
 server app-server2;
}

server {
 listen 80;
 server_name yuor_service_domain_name;
 server_tokens off; - скрывает инфу о Nginx
 access_log off;
 return 301 https://$host$request_uri;
}

server {
 listen 443 ssl;
 listen [::]:443 ssl;
 server_name yuor_service_domain_name;
 server_tokens off;
 ssl_certificate /etc/nginx/ssl/fullchain.pem;
 ssl_certificate_key /etc/nginx/ssl/private.key;
 access_log /var/log/nginx/access.log;
 error_log /var/log/nginx/error.log;
 location {
  client_max_body_size 100m;
  proxy_set_header X-Forwarded-Host $host;
  proxy_set_header X-Forwarded-Server $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_pass http://servicecluster;
 }
}