Nginx は、Docker コンテナ間の負荷分散時に js と css を常に提供するわけではありません - 更新すると動作します

Nginx は、Docker コンテナ間の負荷分散時に js と css を常に提供するわけではありません - 更新すると動作します

同じサーバー上で実行されている 2 つの Docker コンテナー間のリバース プロキシ ロード バランシングとして Nginx を設定しています。ページを初めて読み込むとき、ページは読み込まれますが、すべての CSS ファイルと JS ファイルで 404 エラーが多数表示されます。

ページ読み込み時の404エラー

更新するか、2 番目のタブを開くと、これらのエラーはすべて消え、ページは正常に読み込まれます。これを 1 つのコンテナーのみを提供するように減らすと、同様に正常に動作します。

当初は、jsとcssが同じルートURLからリクエストされており、1人のユーザーに対するリクエストのクラスターが2つのサーバー間でバランスが取られているため、ロードバランサーとコンテナーの一部がエラーを吐き出しているのだと考えていました。少し実験してみて、proxy_set_header Host $hostここそしてここ回答については、私の理解では、これにより、単一のユーザーの後続のリクエストが同じ上流サーバーに送信されるはずです。これにより、問題の発生頻度は低くなったようですが、完全に解消されたわけではありません。

残っている質問(学習中の素人から!):

  • これは の正しい使用法ですかproxy_set_header? また、比較的マイナーなリクエストを 2 つのサーバー間で負荷分散するのではなく、同じアップストリーム サーバーから 1 人のユーザーに js/css を提供することは可能ですか?
  • これがおそらく問題の根本であり、2 番目のコンテナーが最初のコンテナーのページの読み込みによって促されたいくつかの要求に応答する必要があるため、これらの応答が何らかの理由で整列していないということでしょうか。
  • 私のユーザー ベースは、単一の場所からリモート URL に同時にアクセスする 100 ~ 200 人のユーザーです。すべてのリクエストが同じ IP から送信されるため、機能しないと思いますip_hash。単一のユーザーを単一のサーバーにさらに効率的に結び付ける他の方法はありますか?

私の nginx 設定ファイル:

upstream backend {
        least_conn;
        server localhost:4000;
        server localhost:4001;
}

server {
        listen 80;
        listen [::]:80;

        server_name xxxxxxxxxx;

        location / {
                proxy_pass http://backend;
                proxy_redirect http://backend/ $scheme://$host/;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Host $host;
                proxy_set_header Connection $connection_upgrade;
                proxy_read_timeout 20d;
                proxy_buffering off;
        }
}

関連情報