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
- クライアントに応答したレスポンスサイズと同じ
- 上の例では
- ちぐはぐ?
- ステータスコードは最後の
- アンドキュメンテッド?