1つの特定のnginxサーバーが2つのサーバーに受信するtrafficを複製しようとしています。目標は、負荷分散ではなく、すべてのnginxサーバーで同じ入力を再生することです。
例:NginxはHTTP POSTを受信します。これと同じPOST=を他のサーバーに送信します。
**更新**
状況は簡単で複雑ではありません。 POSTデータ(またはGETまたは任意の要求データ)を別のサーバーIP(nginxインスタンスも実行している)に再送信する必要があるだけです。
ユーザー-> POSTデータ-> NGINXインスタンス----リダイレクト--->サーバー1とサーバー2
Post_action状態を使用して複製することができました。
upstream main_upstream {
least_conn;
server 192.168.9.10:80;
keepalive 1024;
}
server {
listen 80;
server_name _;
client_body_buffer_size 1512k;
client_max_body_size 10m;
location /1/ {
fastcgi_pass main_upstream;
post_action @replayevent ;
}
# Send the post_action request to a FastCGI backend for logging.
location @replayevent {
fastcgi_pass 192.168.9.14:80;
}
これで、2つのサーバーにデータが送信されます。
アップストリームがfastcgiをサポートしていない場合(私の場合は問題)、proxy_passに置き換えます。
Nginxだけでこれができるとは思いません。 nginxドキュメンテーションの関連ビット(アップストリームおよびプロキシディレクティブ)をざっと見ただけでは、そうすることはできません。コメントで述べたように、2つのリアサーバーのどちらが応答するかが明確でないため、これはHTTPにも影響します。
1つの代替方法は、varnishのようなものを使用し、varnishreplayを使用して2番目のリアサーバーに対して再生を行うことです。
https://www.varnish-cache.org/docs/2.1/reference/varnishreplay.html
使ったことがないので、最初のリアサーバーとほぼ同時にトラフィックを再生できるかどうかはわかりません。
使用したいのはEM-Proxy [1]のようなものです。任意の数のサーバー間でのhttp要求の分割を簡単に処理します。また、ライブサーバーからのみデータを返し、他のサーバーをブロックするため、ユーザーが複数の応答を受け取らないように正しく処理されます。
NFSサーバーのような中央ストレージを使用し、各nginx WebノードがNFS共有(ファイルレベル)をマウントします。または、OCFS2などのクラスターファイルシステムを使用し、各WebノードがLUN /パーティション(ブロックレベル)をマウントします。