负载平衡器后面的Azure中有IIS服务器。 负载平衡器具有4分钟的不可configuration超时,在此之后,非活动连接被终止。
我们正在尝试将nginx设置为上述IIS群集的反向代理。 一切正常,除了nginx不发送保持活动消息到它打开连接到服务器。 所以,如果服务器花费4分钟以上的时间来回复连接,那么负载均衡器将会终止这个连接。
如果一个客户端(浏览器)直接连接到负载均衡器,它会发送TCP保持活动的消息,并且都是好的。 如果客户端连接到nginx,它发送保持活动到nginx和所有连接到nginx好。 但是在nginx和负载平衡器之间没有保持活着的消息,所以最终连接死亡。
so_keepalive选项似乎与从客户端(浏览器)打开到nginx的连接的TCP保持连接有关。
我们尝试了其他反向代理(IIS ARR代理,haproxy),并且总是遇到同样的问题。
我们不能configuration负载均衡器(在我们的控制之外)。 我们怎么能configurationnginx,nginx或负载均衡器后面的IIS(nginx连接到哪一个)让他们发送保持活动的消息,以保持连接打开?
在Linux和Windows中,打开连接的程序都必须在套接字上设置keep alive选项,以保持活动的数据包被发送。
我们只是更新了nginx的代码,使所有打开的套接字保持活着。 要更新的文件: src/event/ngx_event_connect.c
启用保持活动的代码(仅在Linux上testing):
/* 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; }
在创build套接字并检索连接( ngx_get_connection )之后ngx_event_connect_peer将其置于ngx_event_connect_peer 。
然后,您还需要减less保持活动时间(从默认的2小时),也许还要保持活动的时间间隔。 有关更多详细信息,请参阅http://www.tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO/ 。