web-dev-qa-db-ja.com

TCPキープアライブパケットをサーバーに送信するようにnginxリバースプロキシを構成する

Azureにはロードバランサーの背後にIISサーバーがあります。ロードバランサーには4分の構成不可能なタイムアウトがあり、その後非アクティブな接続が切断されます。

上記のIISクラスター)へのリバースプロキシとしてnginxをセットアップしようとしています。nginxが接続を開いたサーバーにキープアライブメッセージを送信しないことを除いて、すべて正常に機能します。サーバーが応答するのに4分以上かかります。接続はロードバランサーによって切断されます。

クライアント(ブラウザ)がロードバランサーに直接接続する場合、TCPキープアライブメッセージを送信し、すべてが正常です。クライアントがnginxに接続する場合、キープアライブをnginxに送信し、すべてが正常です。 nginxへの接続。ただし、nginxとロードバランサーの間にキープアライブメッセージがないため、最終的に接続が切断されます。

so_keepaliveオプションは、クライアント(ブラウザ)からnginxに開かれた接続のTCPキープアライブ)に関連しているようです。

他のリバースプロキシ(IIS ARRプロキシ、haproxy)を試しましたが、常に同じ問題が発生しました。

ロードバランサーを構成することはできません(制御外)。 Linuxをnginx、nginx、またはIIS(nginxが接続する)ロードバランサーの背後に配置して、キープアライブメッセージを送信して接続を開いたままにする方法を教えてください。

2
Sumrak

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/ を参照してください。

1
Sumrak

ここで検索する人は誰でも試すことができます 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. 
0
zhen fang