ロードバランサ(LB)が2台のWebサーバーにリクエストを振り分けているとします。
このとき、サーバーAには test.html が存在し、サーバーBには存在しない場合、
クライアントからアクセスすると test.html はどう見えるのでしょうか?

実際の挙動

結論からいうと「表示されたり、404エラーになったりする」 です。

ロードバランサは「どのサーバーに処理を振るか」を決めるだけで、
コンテンツの存在までは気にしません。
そのため、

  • サーバーAに振られた場合 → test.html が返る
  • サーバーBに振られた場合 → 404 Not Found が返る
    という挙動になります。

振り分け方式による違い

もう少し正確に説明すると、ロードバランサのアルゴリズムによって、挙動は変わります。

ラウンドロビン

リクエストごとにA → B → A → Bと順番に振り分ける
test.html の結果は交互に「表示」「404」になる

最小コネクション方式

空いている方のサーバーに振る
→ 負荷状況によって表示されたい、表示されなかったりする

スティッキーセッション(同じクライアントは同じサーバーへ)

最初にAを引けばずっと表示できる、Bを引けばずっと404になる

このように「サーバーごとにファイルの有無が違う」状態は、ロードバランシング構成においては危険です。
ユーザー体験が不安定になるだけでなく、
「テストでは動いたのに本番では動かない」といった不具合の温床にもなります。

しかも、本番環境ではWebサーバーが2台あるのに、IT環境や検証環境ではサーバーが1台だけ、なんてケースも珍しくありません。

💡なぜIT企業は、開発環境のこういう部分をケチってしまうんでしょうね。

解決策

1. 全サーバーに同じファイルをデプロイする

  • 一番シンプルで確実な方法
  • CI/CD パイプラインでデプロイを自動化しておくのがベスト

2. 共有ストレージを利用する

  • NFS や AWS EFS をマウントして、どのサーバーからも同じファイルを参照できるようにする
  • 静的コンテンツの一元管理に向いている

3. セッション固定を使う(暫定策)

  • Sticky session を有効化して、同じユーザーを同じサーバーに固定
  • ただしスケーラビリティが下がるので推奨はされない

まとめ

ロードバランサ配下のWebサーバーでは、コンテンツを揃えておくことが大前提です。
片方にしかファイルがないと、ユーザー視点では「表示されたりされなかったりする」という不安定な体験になります。

負荷分散環境では、単に「サーバーを増やせば安心!」ではなく、
ファイル配置やセッションの扱いまで含めた設計が必要です。

シンプルな test.html の例でも、意外とシステム設計の奥深さが見えてきますね。