我们在 Azure 中安装了负载均衡器后面的 IIS 服务器。负载均衡器的超时时间为 4 分钟,不可配置,超过此时间后,非活动连接将被终止。
我们正在尝试将 nginx 设置为上述 IIS 集群的反向代理。一切正常,只是 nginx 不会向其打开连接的服务器发送保持活动消息。因此,如果服务器需要超过 4 分钟的时间来回复,则负载平衡器会终止连接。
如果客户端(浏览器)直接连接到负载均衡器,它会发送 TCP 保持活动消息,一切正常。如果客户端连接到 nginx,它会向 nginx 发送保持活动消息,与 nginx 的连接一切正常。但是 nginx 和负载均衡器之间没有保持活动消息,因此最终连接会中断。
so_keepalive 选项似乎与从客户端(浏览器)打开到 nginx 的连接的 TCP 保持活动有关。
我们尝试了其他反向代理(IIS ARR 代理、haproxy),但总是遇到同样的问题。
我们无法配置负载均衡器(超出我们的控制范围)。我们如何配置带有 nginx 的 Linux、nginx 或负载均衡器后面的 IIS(nginx 连接到该负载均衡器)以让它们发送保持活动消息以保持连接打开?
答案1
无论在 Linux 还是 Windows 中,打开连接的程序都必须在套接字上设置保持活动选项,以便发送保持活动数据包。
我们刚刚更新了 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/更多细节。
答案2
对于任何在这里搜索的人,你可以尝试 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.