nginx обратный прокси поддерживает HTTPS соединение даже после выхода клиента.

Вопрос или проблема

Это похоже на 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:

  1. Параметр proxy_http_version: Ваша конфигурация использует HTTP/1.1, что позволяет сохранить постоянные соединения. Возможно, стоит протестировать использование HTTP/1.0, чтобы проверить, изменится ли поведение.

  2. Настройки keepalive и proxy_read_timeout: Nginx имеет настройки, определяющие, как долго он будет поддерживать соединение с upstream-сервером. Попробуйте задать параметры proxy_read_timeout на низкое значение для тестирования:

    proxy_read_timeout 5s;
  3. Отладка через логи: Ваша запись в журнале ошибок epoll_wait() reported that client prematurely closed connection указывает, что Nginx получает сигнал о закрытии соединения со стороны клиента. Тем не менее, если у вас наблюдается проблема с длительным поддержанием соединения с upstream, необходимо проверить логи Nginx на предмет других сообщений, которые могут помочь понять проблему глубже.

  4. Версия Nginx: Вы упомянули, что используете Nginx версии 1.14.1. Рассмотрите возможность обновления до более новой версии. Многие исправления и улучшения были внесены в Nginx после 1.14.1, и, возможно, проблема уже решена в более поздних версиях.

  5. Поведение SSL/TLS: Убедитесь, что конфигурация SSL на upstream-сервере также правильная и не возникает конфликтов, которые могут вызвать сохранение соединений.

Рекомендации

  1. Обновите Nginx: Если это возможно в вашей среде, обновление до стабильной версии Nginx 1.19 или выше может помочь устранить проблему, учитывая исправления и улучшения, связанные с управлением соединениями.

  2. Проверьте настройки сети: Иногда сетевые параметры или настройки на стороне upstream-сервера также могут оказывать влияние на поведение соединений.

  3. Мониторинг: Рассмотрите возможность внедрения инструментов мониторинга, которые помогут отслеживать состояние соединений и производительность Nginx в реальном времени.

  4. Конфигурация proxy_set_header: Убедитесь, что вы правильно передаете заголовки, такие как Connection, что также может повлиять на поведение соединений:

    proxy_set_header Connection "";

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

Оцените материал
Добавить комментарий

Капча загружается...