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

Слить соединения при перезапуске процесса NGINX?

Я использую NGINX 1.8.1 в CentOS 6 и 7. Во время развертывания требуется, чтобы NGINX был остановлен, развертывание выполнялось и NGINX запускался снова. К сожалению, NGINX во время остановки, кажется, всего 500 подключений. Поскольку я использую Ansible для обновления 2/10 хостов за раз, вероятно, что многие из наших клиентов получат 500 в течение всего процесса развертывания.

Есть ли способ через настройки NGINX, чтобы процесс NGINX истощил все активные соединения (т.е. дождался их завершения), отклоняя все новые соединения во время остановки?

Я знаю, что эластичные балансировщики нагрузки Amazon есть эта функция, есть ли аналог для NGINX?

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

Стоит различать плавное завершение работы и соединение слива; Изящное завершение работы влияет на то, как NGINX обрабатывает входящие соединения во время выключения сервера, но истощение соединения (которое, как упомянул Мартин Хемелс, является функцией NGINX Plus) связано с тем, как NGINX удаляет внутренний сервер из службы, действуя в качестве балансировщика нагрузки. Судя по вашему вопросу, похоже, что вас больше интересует первое.

Согласно комментариям, вы можете попробовать решить эту проблему с помощью брандмауэра:

  • Задача: заблокировать входящие новые подключения, но сохранить уже существующие

  • Пытаться: iptables -I INPUT -j DROP -p tcp --syn --destination-port 80 (или 443, в зависимости от вашей настройки), чтобы установить правило, тем самым блокируя новый трафик

  • Сделайте свое развертывание ...

  • Пытаться: iptables -D INPUT -j DROP -p tcp --syn --destination-port 80 (или 443, в зависимости от вашей настройки), чтобы отменить правило, тем самым разрешив новый трафик

  • Примечание: я только что протестировал это в ближайшее время, он работал, как ожидалось. Но: пожалуйста, не принимайте это как должное и проверьте сами. Обратная связь приветствуется ...

Редактировать: Как отметил @Guntram Blohm в комментариях, лучше использовать iptables -I вместо того iptables -A. Соответствующим образом изменил это в приведенном выше коде.

Насколько я могу судить, слив соединения доступен только в коммерческой версии Nginx Plus.

Здесь есть описание функции: https://www.nginx.com/blog/nginx-plus-r5-released/

Это часть модуль ngx_http_upstream_conf_module.