Вопрос или проблема
Это похоже на 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 в качестве обратного прокси-сервера. В этом случае, когда клиент разрывает соединение, Nginx не всегда закрывает соединение с upstream-сервером, особенно если используется HTTPS. Давайте детально разберем возможные причины и решения данного поведения.
Причины проблемы
-
Версия Nginx: Хотя вы уже заметили, что проблема может быть связана с версией Nginx, ваш версия 1.14.1 не является самой актуальной. Важно проверить, есть ли обновления или патчи, которые могут решить эту конкретную проблему. Имеется информация о том, что версии выше 1.5.5 более успешно справляются с подобными ситуациями, но в вашем случае это может не оказать должного влияния.
-
Поведение HTTPS: При использовании HTTPS, даже если клиент разрывает соединение, Nginx может продолжать поддерживать соединение с upstream-сервером, так как оно шифруется. Это поведение может быть связано с тем, как управляются SSL-сеансы в Nginx.
-
Настройки тайм-аутов: Необходимо проверить настройки тайм-аутов в конфигурации Nginx. Значения, установленные слишком высокими или слишком низкими, могут приводить к нежелательному поведению при разрыве соединений.
Рекомендации
-
Обновление Nginx: Рассмотрите возможность обновления Nginx до последней стабильной версии. Это может решить множество проблем, включая те, которые связаны с управлением соединениями.
-
Настройка параметров: Убедитесь, что вы настроили необходимые параметры тайм-аутов. Попробуйте добавить к вашему конфигурационному файлу следующие директивы:
proxy_read_timeout 10s; proxy_send_timeout 10s; proxy_connect_timeout 10s;
Данные настройки помогут ограничить время ожидания ответов и, возможно, ускорят закрытие соединений при разрыве соединения клиентом.
-
Логирование: Включите расширенное логирование для Nginx. Это поможет вам лучше понять, что происходит в момент разрыва соединения и может дать дополнительную информацию о состоянии upstream-сервера.
-
Проверка состояния соединений: Используйте команду
netstat
или инструменты мониторинга, чтобы увидеть состояние соединений между Nginx и upstream-сервером. Это поможет выявить зависшие соединения и их поведение. -
Контроль на уровне приложения: Если позволяет архитектура, вы можете добавить дополнительный контролирующий механизм на уровень самого upstream-сервера. Например, отслеживание активных сессий и завершение их, если клиент разорвал соединение.
Заключение
Проблема с поддержанием соединения после разрыва клиентом действительно может быть сложной, особенно в среде, где используется HTTPS. Убедитесь в актуальности используемого ПО и рассмотрите возможность настройки параметров тайм-аутов в Nginx. Если проблемы будут сохраняться, вам стоит обратиться к документации или сообществу Nginx для получения дополнительной помощи и советов.