0

コンテンツを検索するために複数のサーバーをローテーションする NGINX アップストリーム定義があります。要求されたコンテンツはこれらのサーバーの 1 つにしかないため、コンテンツが見つかるまで「試行」し続けるか、すべてのアップストリームを使い果たした後に終了します。これはうまく機能しますが、TCP のオーバーヘッドが原因で、正しいサーバーを見つけるためのコンテンツを持たないアップストリーム サーバーを "フィッシング スルー" する際に遅延が発生します。

コンテンツが見つかったサーバーは、キープアライブ / HTTP 1.1 メソッドを使用して正常に接続を確立しました。

私が抱えている問題は、NGINX が 404 を返すアップストリーム サーバーへの TCP 接続を閉じることです。したがって、次回は、別の 404 を取得して (正しい) Web サーバーに移動する前に、TCP 接続を確立する必要があります。

200 フルーツを保持する正しいアップストリーム サーバーとの接続が確立されると、キープアライブを使用してそのアップストリーム接続が正常に確立され、コンテンツに対する後続の試行は、この確立された接続を介して期待どおりに実行されます。これは良いことです。パケット キャプチャと netstats は、後続の複数の HTTP 要求に対するこの接続の寿命を示しています。

私の問題は、(悪い)サーバーのリストをより迅速に実行し、別のTCP接続が毎回「試行」されるのを待つ必要がないことです。

ダウンストリーム NGINX サーバーは、アップストリームではなく、FIN ACK で TCP 接続の閉鎖を開始するサーバーです。

ダウンストリーム構成:

proxy_socket_keepalive on;

upstream myupstream {
        server 10.x.x.x:32700 max_fails=0;
        server 10.y.y.y:32700 max_fails=0;
        server 10.z.z.z:32700 max_fails=0;
        keepalive 32;
}

  location myfile.jpg {
      proxy_set_header Connection "";
      proxy_http_version 1.1;
      proxy_intercept_errors on;
      proxy_pass http://myupstream;
      proxy_next_upstream error timeout http_500 http_502 http_503 http_404;
      proxy_next_upstream_tries     3;
      proxy_read_timeout            2s;
  }

アップストリーム サーバーでさえ、この接続を開いたままにしておくことを望んでいますが、NGINX ダウンストリームは関係なく TCP 接続を終了します。

HTTP/1.1 404 Not Found
Server: nginx
Date: Thu, 20 May 2021 22:44:20 GMT
Content-Type: text/html
Content-Length: 146
Connection: keep-alive

<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

アップストリームからの 404 時の TCP 動作のパケット キャプチャ

4

0 に答える 0