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

Заставить nginx закрыть соединение

У нас есть установка, которая выглядит так:

Клиент -> AWS ELB (балансировка нагрузки TCP) -> NGINX (завершение SSL) -> сервер приложений.

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

Однако, поскольку nginx настроен на использование keep-alive, клиенты, которые уже установили соединение, могут продолжать отправлять новые запросы даже после того, как узел был выведен из балансировщика нагрузки.

Установка Connection: close заголовок во всех ответах сервера приложений не помогает, так как nginx (по праву, согласно RFC) не передает его клиенту.

Есть ли другой способ, кроме как вообще отключить keep-alive?

Мы решили эту проблему, обновив конфигурацию nginx, чтобы отключить keep-alive (установив для keepalive_requests и keepalive_timeout значение 0), а затем перезагрузить nginx как часть процедуры завершения работы приложения.

Вероятно, будет достаточно просто перезагрузить конфигурацию, учитывая, что nginx запускает новый рабочий процесс при перезагрузке и сохраняет только старых рабочих, пока они не завершат свои текущие запросы.