Azureにはロードバランサーの背後にIISサーバーがあります。ロードバランサーには4分の構成不可能なタイムアウトがあり、その後非アクティブな接続が切断されます。
上記のIISクラスター)へのリバースプロキシとしてnginxをセットアップしようとしています。nginxが接続を開いたサーバーにキープアライブメッセージを送信しないことを除いて、すべて正常に機能します。サーバーが応答するのに4分以上かかります。接続はロードバランサーによって切断されます。
クライアント(ブラウザ)がロードバランサーに直接接続する場合、TCPキープアライブメッセージを送信し、すべてが正常です。クライアントがnginxに接続する場合、キープアライブをnginxに送信し、すべてが正常です。 nginxへの接続。ただし、nginxとロードバランサーの間にキープアライブメッセージがないため、最終的に接続が切断されます。
so_keepaliveオプションは、クライアント(ブラウザ)からnginxに開かれた接続のTCPキープアライブ)に関連しているようです。
他のリバースプロキシ(IIS ARRプロキシ、haproxy)を試しましたが、常に同じ問題が発生しました。
ロードバランサーを構成することはできません(制御外)。 Linuxをnginx、nginx、またはIIS(nginxが接続する)ロードバランサーの背後に配置して、キープアライブメッセージを送信して接続を開いたままにする方法を教えてください。
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/ を参照してください。
ここで検索する人は誰でも試すことができます 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.