我正在尝试复制交通一个特定的 nginx 服务器接收到两个服务器的请求。目的不是负载平衡,而是在所有 nginx 服务器上重放相同的输入。
举个例子:Nginx 收到一个 HTTP POST。我想将这个相同的 POST 发送到其他服务器。
** 更新 **
情况很简单,并不复杂。我只需要将 POST 数据(或 GET 或任何请求数据)重新发送到另一个服务器 IP(它也运行一个 nginx 实例)。就这样。
用户 -> POST 数据 -> NGINX 实例 ----重定向 ---> 服务器 1 和服务器 2
答案1
我能够使用 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;
}
现在它将数据发送到两个服务器。
如果您的上游不支持 fastcgi(我的情况就是这样),请用 proxy_pass 替换。
答案2
我不相信你能用 nginx 本身做到这一点;快速浏览 nginx 文档的相关部分(上游和代理指令)并不表明你能做到这一点。正如评论中所述,这也会破坏 HTTP,因为不清楚两个后端服务器中的哪一个会响应。
另一种方法是使用类似 varnish 的东西,然后使用 varnishreplay 对第二个后置服务器进行重放:
https://www.varnish-cache.org/docs/2.1/reference/varnishreplay.html
我没有用过它,所以我不知道你是否可以让它与第一个后置服务器几乎同时重放流量。
答案3
您需要使用类似 EM-Proxy[1] 的东西。它可以轻松处理在任意数量的服务器上拆分 http 请求。它还可以正确处理仅从实时服务器返回数据并阻止其他服务器,以便用户不会收到多个响应。
答案4
使用 NFS 服务器等中央存储,每个 nginx Web 节点挂载 NFS 共享(文件级)。或者使用 OCFS2 等集群文件系统,每个 Web 节点挂载 LUN/分区(块级)。