Бесплатный 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;
}
}