比方说,我有一些服务工作在原始的TCP级别,我想添加一个负载平衡。 我试过使用ngx_stream_core_module 。 虽然TCPstream确实代理到后端服务器,但我发现了一些我无法解决的问题。
我的服务在node.js中写入,这是设置进程pipe理器的常用技术,比如pm2,它在消耗太多内存的情况下重新启动节点。 但是,这显然会终止所有连接的客户端。 我的期望是nginx将用户连接到上游的下一个服务器(也许它也是> 2016,但是),但我的连接只是closures。
我的服务需要最终用户的IP和远程端口来操作,但在应用程序套接字的remoteAddress和remotePort指向本地nginx实例。 也就是说,当我打印到缓冲区时,我看到127.0.0.1连接代理时,我真正的IP当我直接连接到节点。 我看到nginx支持一些configurationvariables(自v.1.11.2起),而$ remote_addr就是其中之一。 但我没有看到任何信息如何将这个variables转发到上游。 proxy_set_header指令在stream中不可用,因为TCP中没有任何“头文件”,所以它看起来没问题。 这甚至有可能吗?
我不是一个devops,而是一个编码器,所以我听说了haproxy,但是我不知道它是否可以解决这两个问题。 它可以?
为了testing,我用哑巴回声node.js服务器,所有的工作部分被缩小到
server.on('connection', socket => { socket.write(`Hello from ${instance}, ${socket.remoteAddress}:${socket.remotePort}\n`); });
而我的nginxconfiguration的相关部分是
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
这是模块文档 。
这不是TCP可以使用的东西,因为它肯定会打破几乎所有在ontop上运行的协议。 例如,如果在某条消息或命令的中间连接将被丢弃,该怎么办?
您可以使用代理协议来传输原始IP,但需要您的后端支持。
或者你可以configuration绑定到客户IP :
proxy_bind $remote_addr transparent;