web-dev-qa-db-ja.com

nginxデータを2つのサーバーに複製する方法は?

1つの特定のnginxサーバーが2つのサーバーに受信するtrafficを複製しようとしています。目標は、負荷分散ではなく、すべてのnginxサーバーで同じ入力を再生することです。

例:NginxはHTTP POSTを受信します。これと同じPOST=を他のサーバーに送信します。

**更新**

状況は簡単で複雑ではありません。 POSTデータ(またはGETまたは任意の要求データ)を別のサーバーIP(nginxインスタンスも実行している)に再送信する必要があるだけです。

ユーザー-> POSTデータ-> NGINXインスタンス----リダイレクト--->サーバー1とサーバー2

14
Bernard Bay

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に置き換えます。

10
Chucks

Nginxだけでこれができるとは思いません。 nginxドキュメンテーションの関連ビット(アップストリームおよびプロキシディレクティブ)をざっと見ただけでは、そうすることはできません。コメントで述べたように、2つのリアサーバーのどちらが応答するかが明確でないため、これはHTTPにも影響します。

1つの代替方法は、varnishのようなものを使用し、varnishreplayを使用して2番目のリアサーバーに対して再生を行うことです。

https://www.varnish-cache.org/docs/2.1/reference/varnishreplay.html

使ったことがないので、最初のリアサーバーとほぼ同時にトラフィックを再生できるかどうかはわかりません。

4
cjc

使用したいのはEM-Proxy [1]のようなものです。任意の数のサーバー間でのhttp要求の分割を簡単に処理します。また、ライブサーバーからのみデータを返し、他のサーバーをブロックするため、ユーザーが複数の応答を受け取らないように正しく処理されます。

[1] https://github.com/igrigorik/em-proxy/

3
Chris Johnston

NFSサーバーのような中央ストレージを使用し、各nginx WebノードがNFS共有(ファイルレベル)をマウントします。または、OCFS2などのクラスターファイルシステムを使用し、各WebノードがLUN /パーティション(ブロックレベル)をマウントします。

2
HTTP500