假设我有一些服务在原始 TCP 级别上运行,我想为其添加负载平衡。我尝试使用ngx_stream_core_module
。虽然 TCP 流确实代理到后端服务器,但我发现一些我无法解决的问题。
我的服务是用 node.js 编写的,设置进程管理器(如 pm2)是一种常用技术,如果节点消耗了太多内存,它会重新启动节点。但这显然会终止所有连接的客户端。我原本期望 nginx 会将用户连接到上游的下一个服务器(好吧,也许它太老了,但),但我的连接却关闭了。
我的服务需要最终用户 IP 和远程端口才能运行,但在应用程序套接字中,remoteAddress 和 remotePort 指向本地 nginx 实例。即当我将其打印到缓冲区时,当连接通过代理时,我会看到 127.0.0.1,而当我直接连接到节点时,我会看到我的真实 IP。我看到 nginx 支持一些配置变量(自 v.1.11.2 以来),其中就包括 $remote_addr。但我没有看到任何有关如何将此变量转发到上游的信息。
proxy_set_header
指令在流内不可用,看起来没问题,因为 TCP 中没有任何“标头”。这可能吗?我不是一名 DevOps 人员,而是一名程序员,所以我听说过 haproxy,但我不知道它是否可以解决这两个问题。可以吗?
为了进行测试,我使用了哑 echo node.js 服务器,其中所有工作部分都缩小到
server.on('connection', socket => {
socket.write(`Hello from ${instance}, ${socket.remoteAddress}:${socket.remotePort}\n`);
});
我的 nginx 配置的相关部分是
stream {
upstream echo {
server localhost:9000;
server localhost:9001;
}
server {
listen 8080;
proxy_connect_timeout 1s;
proxy_timeout 2h;
proxy_pass echo;
}
}
最后我使用 netcat 来检查。
// direct connect
~|⇒ nc 95.85.15.120 9000
Hello, ::ffff:86.110.174.98:65408
// proxied connect
~|⇒ nc 95.85.15.120 8080
Hello, ::ffff:127.0.0.1:44056
这里是模块文档。