2つのアプリケーション(Webフロントエンド(IIS)と.NET Coreバックエンド(Kestrel))のリバースプロキシとして実行するようにnginxを構成しようとしています。これらはすべて、Dockerスウォームで実行されます。/apiへのすべての呼び出しをバックエンドに、他のすべての呼び出しをフロントエンドに書き換えています。
現在の設定では、アプリケーションにログインするまですべてが正常に機能します。これはIdentityServerOAuth/OpenID認証サービスを使用し、Bearerトークンを使用するすべての呼び出しのリクエストにAuthorization-headerを追加します。このヘッダーが存在するとすぐに、nginxサーバーはアップストリームサーバーからタイムアウトを返します。これは両方のサーバーで発生します。認証ヘッダーの受け渡しを無効にすると、nginxは正常に機能し、リクエストをプロキシします。フロントエンドの場合、ヘッダーを必要としないため、これは問題ではありませんが、バックエンドは明らかに機能しなくなります。奇妙なことに、ある時点でヘッダーを切り取った場合(かなり長い文字列です)、リクエストは機能しますが、有効なトークンではなくなったため、明らかに私のバックエンドサービスは500を返します。
私は何が悪いのかを理解しようと頭を悩ませてきましたし、いくつかの構成オプションを試しました。プロキシの背後にあるどちらのサーバーも、失敗してもリクエストを受信しないため、リクエストはnginxで停止しているように見えます。 nginxレベルでログを記録すると、アップストリームから応答ヘッダーを読み取っているときにアップストリームがタイムアウトしました(110:操作がタイムアウトしました)-エラーが発生し、タイムアウトを増やしても何も起こりません。ヘッダーは機能します。
この問題は、WindowsとLinuxノードでハイブリッドスウォームを実行していることが原因であると思われます。 ネットワークドライバに関連するバグ があります。奇妙なことに、遭遇する人はほとんどいないようです。リクエストが大きくなりすぎると、リクエストはDockerネットワーク内で適切にルーティングされません。これにより、nginxはリクエストを送信し、リクエストがアップストリームサーバーに到達しないため、返信が届かないのを待ちます...