У нас есть установка, которая выглядит так:
Клиент -> 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 запускает новый рабочий процесс при перезагрузке и сохраняет только старых рабочих, пока они не завершат свои текущие запросы.