haproxy 背後で 2 つのホストを実行すると、ランダムな 404 エラーが発生して失敗します

今日は、Discourseインスタンスの1つをホストするために2台目のサーバーを追加しようとしました。コンテナは、外部のRedis、Postgres、ストレージサーバーを使用するように設定されており、Webアプリのみが実行されます。これまでのところ、HAProxyの背後で単一サーバーのサイトを問題なく実行してきました。HAProxyの背後で2台のサーバーを実行すると、nginxからJSファイルに対して多くの404エラーが発生します。HAProxyからどちらかのサーバーを削除すると、この問題は解消されます。404になるファイルのURLは同一に見えるため、なぜどちらのサーバーでも提供されないのか見当が付きません。

開発者設定にオーバーライドはありません。バージョン2.4.3 stableを実行しています。

複数の Web コンテナを実行している場合、両方が静的ファイルにアクセスできるようにする仕組みが必要です。

最も簡単な方法は、アップロードにオブジェクトストレージを使用する(S3 クローン)です。

@Falco 返信ありがとうございます。2 つのサーバーは NFS を介して共有ストレージを使用しています。コンテナ設定には以下が含まれています。

volumes:
  - volume:
      host: {{ discourse_nas_path }}/data
      guest: /shared
  - volume:
      host: {{ discourse_nas_path }}/logs
      guest: /var/log

ただし、各コンテナは assets:precompile ステップで生成されたアセットの独自のコピーを保存しています。コンパイル済みアセットを共有する必要がありますか?

Haproxy のバックエンドの追加・削除以外に、どのようなテストを行いましたか?

Haproxy の設定はランダムなバックエンド選択ですか、それともアフィニティ(セッション維持)ですか?404 エラーは Haproxy でログ記録されていますか?nginx でログ記録されていますか?エラーが発生するのは最初のバックエンドですか、それとも 2 番目ですか?サイトにはログインが必要ですか?プロキシサーバーの背後から直接 nginx に接続した際にエラーを再現できますか?要求されているファイルはディスク上に存在しますか?すべての JS ファイルが対象ですか、それとも特定のファイルだけですか?

@Falco さんからのヒントのおかげで、コンテナ設定に以下を追加したところ、期待通りに動作するようになりました:

  - volume:
      host: {{ discourse_nas_path }}/assets
      guest: /var/www/discourse/public/assets