Назад | Перейти на главную страницу

Настройка обратного прокси nginx для отправки пакетов TCP keep alive на сервер

У нас есть серверы IIS в Azure за балансировщиком нагрузки. Балансировщик нагрузки имеет неконфигурируемый тайм-аут в 4 минуты, по истечении которого неактивное соединение прерывается.

Мы пытаемся настроить nginx в качестве обратного прокси для кластера IIS, описанного выше. Все работает нормально, за исключением того, что nginx не отправляет сообщения keep alive на сервер, к которому он открыл соединение. Итак, если серверу требуется более 4 минут для ответа, соединение разрывается балансировщиком нагрузки.

Если клиент (браузер) подключается к подсистеме балансировки нагрузки напрямую, он отправляет сообщения TCP keep alive, и все в порядке. Если клиент подключается к nginx, он отправляет keep alive на nginx, и с подключением к nginx все в порядке. Но между nginx и балансировщиком нагрузки нет сообщений keep alive, поэтому в конечном итоге соединение прерывается.

Параметр so_keepalive, похоже, связан с TCP keep alive для подключений, открытых к nginx из клиента (браузера).

Мы пробовали другие обратные прокси (прокси IIS ARR, haproxy) и всегда сталкивались с одной и той же проблемой.

Мы не можем настроить балансировщик нагрузки (вне нашего контроля). Как мы могли настроить Linux с nginx, nginx или IIS за балансировщиком нагрузки (к которому подключается nginx), чтобы заставить их отправлять сообщения keep alive, чтобы соединение оставалось открытым?

И в Linux, и в Windows программа, открывающая соединение, должна установить опцию keep alive для сокета для отправки пакетов keep alive.

Мы только что обновили код nginx, чтобы разрешить сохранение активности для всех открытых сокетов. Файл для обновления: src/event/ngx_event_connect.c

Код для включения сохранения активности (проверено только в Linux):

    /* Set the option active */
    int tcp_keepalive = 1;
    if(setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (const void *) &tcp_keepalive, sizeof(int)) < 0) {
        return NGX_ERROR;
    }

Положи это в ngx_event_connect_peer сразу после создания сокета и получения соединения (ngx_get_connection).

Затем вам нужно будет также уменьшить время сохранения активности (по умолчанию 2 часа) и, возможно, интервал сохранения активности. Видеть http://www.tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO/ Больше подробностей.

Для всех, кто ищет здесь, вы можете попробовать http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_socket_keepalive

Syntax:     proxy_socket_keepalive on | off;
Default:    

proxy_socket_keepalive off;

Context:    http, server, location

This directive appeared in version 1.15.6.

Configures the “TCP keepalive” behavior for outgoing connections to a proxied server. By default, the operating system’s settings are in effect for the socket. If the directive is set to the value “on”, the SO_KEEPALIVE socket option is turned on for the socket.