LoginSignup
26
21

More than 5 years have passed since last update.

nginx で複数のサーバにリクエストを複製する

Posted at

nginx で構築したリバースプロキシで、受け取ったリクエストを別のサーバへ複製する(L2SW のミラーポートの HTTP 版のようなイメージ)。

以下のように post_action を使います。この例だと http://localhost:8000 がもともとのプロキシ先で、同じリクエストが http://localhost:8001 に複製されます。

server {
    listen 8080 default_server;
    server_name _;

    location / {
        proxy_pass http://localhost:8000;
        post_action @mirror;
    }

    location @mirror {
        internal;
        proxy_pass http://localhost:8001;
    }
}

数珠つなぎにして、複数のサーバへ複製することもできます。

server {
    listen 8080 default_server;
    server_name _;

    location / {
        proxy_pass http://localhost:8000;
        post_action @mirror1;
    }

    location @mirror1 {
        internal;
        proxy_pass http://localhost:8001;
        post_action @mirror2;
    }

    location @mirror2 {
        internal;
        proxy_pass http://localhost:8002;
        post_action @mirror3;
    }

    location @mirror3 {
        internal;
        proxy_pass http://localhost:8003;
    }
}
  • クライアントには post_action ではないプロキシの結果が返る
    • 上の例では http://localhost:8000
    • 仮にこのプロキシをメインプロキシと呼ぶ
    • メインプロキシが 500 とかで、他が 200 でも、クライアントへは 500 が返る
    • 逆に、メインプロキシが 200 で、他が 500 とかでも、クライアントへは 200 が返る
  • メインプロキシが結果を返せばクライアントに結果が返される
    • その他のプロキシの応答が遅くてもクライアントへの応答速度は変わらない
  • プロキシへのリクエストは順番に行われる
    • リクエストが終わったら次へ、それも終わったら次へ、のように
  • アクセスログはすべての post_action が終わったときに書き込まれる
    • ステータスコードは最後の post_action の結果が書き込まれる
      • 上の例では http://localhost:8003
      • クライアントに応答したステータスコードとは異なることがある
    • レスポンスサイズにはメインプロキシの結果が書き込まれる
      • 上の例では http://localhost:8000
      • クライアントに応答したレスポンスサイズと同じ
    • ちぐはぐ?
  • アンドキュメンテッド?

参考

26
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
21