Мы используем nginx в качестве балансировщика нагрузки / аварийного переключения для пары вышестоящих серверов. Мы начали 11/1.
Эта диаграмма показывает картинку. Там, где нет точки, в тот день не было 502:
В первые несколько дней в журналах отображается небольшое количество кодов ответа 502, вероятно, из-за настройки или других действий, когда мы стабилизировали конфигурацию nginx. Затем мы работали в течение 12 дней без ошибок 502 (кроме одного сообщения 11/13 - опять же, может быть, настройка).
20 ноября мы переместили завершение SSL с вышестоящих серверов на границу. С тех пор мы видим 502 с каждый день, и это число, кажется, растет (в процентах от всех запросов).
Вчера впервые с 01.11 мы начали получать жалобы клиентов.
Несмотря на низкий процент (никогда не достигающий 1%) всего трафика (~ ½ миллиона запросов в день), они обычно группируются и занимают ~ 10-15 секунд. В это время многие пользователи сталкиваются с ухудшением функциональности или потерей доступа.
nginx.conf
worker_processes auto;
events {
worker_connections 1024;
use epoll;
multi_accept on;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 70;
keepalive_requests 100000;
tcp_nopush on;
tcp_nodelay on;
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 5;
open_file_cache_errors off;
gzip on;
gzip_min_length 1000;
gzip_types application/x-javascript text/css application/javascript text/javascript text/plain text/xml application/json application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/xml font/eot font/opentype font/otf image/svg+xml image/vnd.microsoft.icon;
gzip_disable "MSIE [1-6]\.";
log_format main '$time_iso8601\t$status\t$remote_addr\t$upstream_addr\t$upstream_status\t$scheme\t$request\t$request_time\t$upstream_response_time\t$body_bytes_sent';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log error;
# error_log /var/log/nginx/error_debug.log
upstream example {
server 192.168.1.40:80;
server 192.168.1.41:80;
}
server {
listen 80;
listen 443 default ssl;
server_name example.com;
# ssl on;
ssl_certificate ssl/example.com.crt;
ssl_certificate_key ssl/example.com.key;
ssl_trusted_certificate ssl/example.com.pem;
location / {
proxy_read_timeout 180;
proxy_pass http://example;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
Когда попадает 502, журнал доступа предоставляет следующие значения:
$status: 502
$upstream_addr: 192.168.1.40, example
$upstream_status: 500, 502
или
$status: 502
$upstream_addr: example
$upstream_status: 502
или подобные варианты.
Журнал ошибок говорит:
[error] 21293#21293: *2441745 no live upstreams while connecting to upstream
Детали установки:
Мои вопросы:
ИЗМЕНИТЬ ДОБАВИТЬ:
NGINX генерирует ошибку 502, потому что он не может установить http-соединение, когда это необходимо, с восходящими потоками (ваш 'proxy_pass http://example;
'config).
Первое, что нужно проверить, - это ваши вышестоящие серверы. Проверьте журналы ошибок сервера и системный журнал, чтобы узнать, почему они могут давать сбой.
Проблема стала больше, когда вы перешли с проксирования SSL-соединения с использованием балансировки нагрузки TCP (потока) на завершение SSL и создание http-соединений с восходящим потоком? Если это так, то одним из следствий этого изменения является то, что восходящие потоки могут обрабатывать более частые TCP-соединения:
Вы можете побудить NGINX держать TCP-соединения открытыми и повторно использовать их для будущих запросов, настроив NGINX на использование соединений keepalive с вышестоящими, как описано. Это изменение может уменьшить количество ошибок 502.
Добавьте следующее в свой блок местоположения рядом с proxy_pass
директива:
proxy_http_version 1.1;
proxy_set_header Connection "";
Добавьте в конфигурацию вышестоящей группы следующее:
keepalive 20;
Подробнее см. Здесь: https://www.nginx.com/blog/load-balancing-with-nginx-plus-part2/#keepalive