IISアプリケーションリクエストルーティングをリバースプロキシキャッシュとして使用したいと考えています。私はいくつかの異なるオプションを検討し、それが私のニーズに最も適しているという結論に達しました。しかし、私はある種の行き詰まりに遭遇し、ARRモジュールの経験が豊富な人からの入力を実際に使用することができました。
私は次の設定をしています:
- 内部サーバーファームへのIISARRキャッシュプロキシ要求(最も近いオリジンサーバーを使用するための加重ラウンドロビン負荷分散)。
- IISプロキシでは、Keepaliveが無効になっています。
- サーバーファームはnginxウェブサーバーで構成されています。
- IISサーバーにはRAMディスクキャッシュがあります。
ユースケースは、エッジサーバーがバイト範囲要求を受信し、コンテンツをエンドユーザーに提供するときに、それをキャッシュする(メモリキャッシュに最初の60秒、次にRAMディスクに書き込む)場合です。これまでのところすべてが正常に機能していますが、次のエンドユーザーが同じバイト範囲(現在はキャッシュにある)を要求し始めると、IISエッジとnginxオリジンの間で奇妙な動作が見られます:最初のバイト範囲の要求時(2番目のエンドユーザーによる)IISサーバーは、要求されたセグメントが既にキャッシュにあるため、使用しないnginxオリジンへの接続を開きます。接続が使用されていないため、タイムアウト(60秒)のために最終的にnginxによって閉じられます。その間、2番目のエンドユーザーはまだキャッシュ内にあるファイルのセグメントを要求しています。それで、ここで問題が発生し、2番目のエンドユーザーはファイル内のキャッシュにないポイントに到達します。ここでIISに期待する動作(keep-aliveが無効になっているため)は、オリジンへの新しい接続を開き、キャッシュにないファイルの部分のフェッチを開始することです。ただし、私が見ている動作は、IISが要求の開始時に開いたのと同じ接続を再利用しようとすることです(オリジンによってドロップされたことに気付くことはありません)。「Failedrequesttraceing」を使用してこれも確認しましたが、その結果、IISはオリジンから期待される応答を受け取らず(接続が存在しなくなったため)、次に、エンドユーザーに502.3。ここでIISに期待する動作(keep-aliveが無効になっているため)は、オリジンへの新しい接続を開き、キャッシュにないファイルの部分のフェッチを開始することです。ただし、私が見ている動作は、IISが要求の開始時に開いたのと同じ接続を再利用しようとすることです(オリジンによってドロップされたことに気付くことはありません)。「Failedrequesttraceing」を使用してこれも確認しましたが、その結果、IISはオリジンから期待される応答を受け取らず(接続が存在しなくなったため)、次に、エンドユーザーに502.3。ここでIISに期待する動作(keep-aliveが無効になっているため)は、オリジンへの新しい接続を開き、キャッシュにないファイルの部分のフェッチを開始することです。ただし、私が見ている動作は、IISが要求の開始時に開いたのと同じ接続を再利用しようとすることです(オリジンによってドロップされたことに気付くことはありません)。「Failedrequesttraceing」を使用してこれも確認しましたが、その結果、IISはオリジンから期待される応答を受け取らず(接続が存在しなくなったため)、次に、エンドユーザーに502.3。ただし、私が見ている動作は、IISが要求の開始時に開いたのと同じ接続を再利用しようとすることです(オリジンによってドロップされたことに気付くことはありません)。「Failedrequesttraceing」を使用してこれも確認しましたが、その結果、IISはオリジンから期待される応答を受け取らず(接続が存在しなくなったため)、次に、エンドユーザーに502.3。ただし、私が見ている動作は、IISが要求の開始時に開いたのと同じ接続を再利用しようとすることです(オリジンによってドロップされたことに気付くことはありません)。「Failedrequesttraceing」を使用してこれも確認しましたが、その結果、IISはオリジンから期待される応答を受け取らず(接続が存在しなくなったため)、次に、エンドユーザーに502.3。
オリジンで接続タイムアウトを増やすと問題が「解決」することを確認しましたが、基本的に無限のタイムアウトを設定する必要があるため、これは実際には実行可能な解決策ではありません。これにより、オリジン側でまったく新しい一連の問題が発生する可能性があります。 。IISがこのアップストリーム接続を処理する方法を制御する方法はありますか(つまり、オリジンからのデータが実際に必要なときに新しい接続を強制的に開くか、オリジンが接続を閉じたことを認識させる)?