Вопрос или проблема
Это похоже на nginx обратный прокси – не закрывает соединение с upstream, когда клиент HTTPS отключается. Единственное отличие заключается в том, что сервер слушает на 80 и перенаправляет на 443 (конфигурация ниже).
server {
listen 80;
server_name localhost;
location / {
proxy_http_version 1.1;
proxy_pass https://112.123.134.145:443;
proxy_ssl_certificate /etc/nginx/cert.pem;
proxy_ssl_certificate_key /etc/nginx/key.pem;
proxy_ssl_verify off;
}
}
В основном, когда включен HTTPS, nginx, похоже, поддерживает соединение с upstream даже после выхода клиента.
Один из ответов указывает, что проблема решена для nginx >= 1.5.5. У меня nginx 1.14.1, но проблема все еще сохраняется.
После дальнейшего изучения HTTP соединение должно быть закрыто, как отражено в журнале ошибок.
2024/10/15 18:28:07 [info] 1429884#0: *3 epoll_wait() сообщил, что клиент преждевременно закрыл соединение, поэтому соединение с upstream также закрыто во время чтения upstream
Тем не менее, HTTPS остается подключенным.
Ответ или решение
Конфигурация Nginx как обратного прокси-сервера, работающего с HTTPS, может вызывать некоторые сложности, особенно когда речь идет о поддержании соединений после отключения клиента. В вашем случае, несмотря на сообщение о том, что клиент закрыл соединение, вы наблюдаете, что соединение с upstream-сервером остается активным. Давайте более подробно разберем этот вопрос и предложим возможные решения.
Проблема: Соединение с Upstream-сервером продолжает оставаться активным
При использовании Nginx в качестве обратного прокси-сервера, который принимает запросы на порту 80 и затем перенаправляет их на HTTPS-ресурс на порту 443, важно понимать, как Nginx управляет соединениями с клиентами и upstream-серверами.
В вашем конфигурационном файле указано, что вы слушаете на порту 80 и проксируете запросы на HTTPS-сервер:
server {
listen 80;
server_name localhost;
location / {
proxy_http_version 1.1;
proxy_pass https://112.123.134.145:443;
proxy_ssl_certificate /etc/nginx/cert.pem;
proxy_ssl_certificate_key /etc/nginx/key.pem;
proxy_ssl_verify off;
}
}
При этом вам стоит обратить внимание на следующие аспекты, которые могут оказывать влияние на поведение Nginx:
-
Параметр
proxy_http_version
: Ваша конфигурация использует HTTP/1.1, что позволяет сохранить постоянные соединения. Возможно, стоит протестировать использование HTTP/1.0, чтобы проверить, изменится ли поведение. -
Настройки
keepalive
иproxy_read_timeout
: Nginx имеет настройки, определяющие, как долго он будет поддерживать соединение с upstream-сервером. Попробуйте задать параметрыproxy_read_timeout
на низкое значение для тестирования:proxy_read_timeout 5s;
-
Отладка через логи: Ваша запись в журнале ошибок
epoll_wait() reported that client prematurely closed connection
указывает, что Nginx получает сигнал о закрытии соединения со стороны клиента. Тем не менее, если у вас наблюдается проблема с длительным поддержанием соединения с upstream, необходимо проверить логи Nginx на предмет других сообщений, которые могут помочь понять проблему глубже. -
Версия Nginx: Вы упомянули, что используете Nginx версии 1.14.1. Рассмотрите возможность обновления до более новой версии. Многие исправления и улучшения были внесены в Nginx после 1.14.1, и, возможно, проблема уже решена в более поздних версиях.
-
Поведение SSL/TLS: Убедитесь, что конфигурация SSL на upstream-сервере также правильная и не возникает конфликтов, которые могут вызвать сохранение соединений.
Рекомендации
-
Обновите Nginx: Если это возможно в вашей среде, обновление до стабильной версии Nginx 1.19 или выше может помочь устранить проблему, учитывая исправления и улучшения, связанные с управлением соединениями.
-
Проверьте настройки сети: Иногда сетевые параметры или настройки на стороне upstream-сервера также могут оказывать влияние на поведение соединений.
-
Мониторинг: Рассмотрите возможность внедрения инструментов мониторинга, которые помогут отслеживать состояние соединений и производительность Nginx в реальном времени.
-
Конфигурация
proxy_set_header
: Убедитесь, что вы правильно передаете заголовки, такие какConnection
, что также может повлиять на поведение соединений:proxy_set_header Connection "";
Следуя этим рекомендациям, вы сможете более эффективно управлять соединениями в вашей конфигурации Nginx и потенциально устранить описанную проблему. Если проблема сохраняется, рассмотрите возможность получения дополнительной поддержки от специалистов по Nginx или сообществе разработчиков.