ngx_stream_core_module 和最终用户 ip

ngx_stream_core_module 和最终用户 ip

假设我有一些服务在原始 TCP 级别上运行,我想为其添加负载平衡。我尝试使用ngx_stream_core_module。虽然 TCP 流确实代理到后端服务器,但我发现一些我无法解决的问题。

  1. 我的服务是用 node.js 编写的,设置进程管理器(如 pm2)是一种常用技术,如果节点消耗了太多内存,它会重新启动节点。但这显然会终止所有连接的客户端。我原本期望 nginx 会将用户连接到上游的下一个服务器(好吧,也许它太老了,但),但我的连接却关闭了。

  2. 我的服务需要最终用户 IP 和远程端口才能运行,但在应用程序套接字中,remoteAddress 和 remotePort 指向本地 nginx 实例。即当我将其打印到缓冲区时,当连接通过代理时,我会看到 127.0.0.1,而当我直接连接到节点时,我会看到我的真实 IP。我看到 nginx 支持一些配置变量(自 v.1.11.2 以来),其中就包括 $remote_addr。但我没有看到任何有关如何将此变量转发到上游的信息。proxy_set_header指令在流内不可用,看起来没问题,因为 TCP 中没有任何“标头”。这可能吗?

  3. 我不是一名 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

这里是模块文档

答案1

  1. 这对于 TCP 来说是不可能的,因为它肯定会破坏几乎所有在其上运行的协议。例如,如果在传输某些消息或命令的过程中连接断开了怎么办?

  2. 您可以使用代理协议来转移原始IP,但是需要你的后端支持。

    或者您可以配置绑定到客户端 IP

     proxy_bind $remote_addr transparent;
    

相关内容