У меня есть сценарий, когда на нескольких серверах работает экземпляр nginx. Как бы то ни было, это в основном просто проксированные запросы. Все эти хосты находятся за аппаратным балансировщиком нагрузки, и включение закрепления не обязательно (или желательно по разным причинам).
Несмотря на это, в настоящее время мы по-прежнему соблюдаем keep-alive, чтобы сократить количество подтверждений SSL; но я думаю, что это работает, только если клиент перенаправляется на тот же хост после первоначального рукопожатия.
В результате мы получаем тысячи неактивных соединений, открытых на каждом из наших хостов; в какой-то момент аппаратному маршрутизатору это надоедает, и он начинает посылать RST-пакеты клиентам. (Если бы этого не произошло, я подозреваю, что мы достигли предела количества открытых подключений в nginx, поэтому проблема все еще существует за пределами этого аппаратного маршрутизатора).
Мой вопрос (точнее, мои вопросы):
- Могу ли я заставить nginx обрабатывать каждый запрос как простую транзакцию и не соблюдать keep-alive? Это разумно? Я знаю, что некоторые прошлые службы, над которыми я работал, в основном делали это, но есть ли какие-либо потенциальные недостатки для клиентов, которые ожидают, что их заголовок Keep-Alive будет соблюдаться? Очевидно, это может привести к большему количеству согласований SSL / TLS, но в моем случае это нормально.
- Существуют ли лучшие практики для корректного завершения незанятых клиентских подключений в nginx?
- Было бы разумно просто позволить этим неактивным соединениям накапливаться на хосте? До какой степени? Десятки тысяч простаивающих подключений?
Возможно, я не понимаю вопроса, но не стоит устанавливать keepalive_timeout
в конфигурации nginx на 0 делай что хочешь?
https://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_timeout
строка для добавления будет просто
keepalive_timeout 0;