Назад | Перейти на главную страницу

Перенос завершения SSL на границу увеличил количество ошибок 502

Мы используем 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-соединения:

  • При проксировании SSL-соединения с использованием балансировки нагрузки TCP (поток) все запросы в соединении отправляются восходящему потоку в том же прокси-соединении.
  • При разрыве соединения и последующей отправке новых запросов в восходящий поток NGINX по умолчанию создает новое 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