在 Nginx 中使用 stream 模块进行 TCP 代理时,可以将 TCP 或 UDP 流量转发到指定的后端服务器。你给出的配置是一个用于代理 RabbitMQ 的示例,具体是在 TCP 层上代理 5672 端口的流量。
只能在nginx.conf配置上代理

stream {
    # 定义 upstream,指定 RabbitMQ 服务的真实地址和端口
    upstream rabbitmq {
        server 192.168.1.100:5672;  # 替换为实际的 RabbitMQ 地址
    }

    # 配置 Nginx 监听对外暴露的 5672 端口
    server {
        listen 5672;  # Nginx 对外暴露的端口
        proxy_pass rabbitmq;  # 将流量转发到上游的 RabbitMQ 服务器
    }
}


解释:
stream 块:

stream 块是 Nginx 配置的一个重要部分,用于处理 TCP 和 UDP 流量的代理。它与 HTTP 相关配置不同,专门用于处理网络流量而非 HTTP 请求。
在 stream 块中,可以使用 server 块来处理和代理 TCP 或 UDP 请求。
upstream rabbitmq:

这里的 upstream 定义了一个名为 rabbitmq 的上游服务器组,指向真实的 RabbitMQ 服务。你需要将 ip 替换为实际的 RabbitMQ 服务地址。
server ip:5672 是将流量转发到指定 IP 和端口(这里是 RabbitMQ 默认的端口 5672)。
server { listen 5672; }:

这里的 server 块配置 Nginx 监听 5672 端口,即对外暴露端口。客户端可以通过此端口连接到 Nginx,然后 Nginx 将代理流量转发到 upstream rabbitmq 中指定的服务器。
proxy_pass rabbitmq;:

proxy_pass 指示 Nginx 将监听到的流量转发到名为 rabbitmq 的上游服务器组。这里的 rabbitmq 指的是前面定义的 upstream 块,表示将流量代理到实际的 RabbitMQ 服务。
关键点:
流量代理:此配置实际上是将客户端连接到 Nginx 服务器(在 5672 端口)时的流量,转发到指定的 RabbitMQ 实际服务。
用于 TCP 代理:stream 块处理的是 TCP 或 UDP 流量,因此它适用于像 RabbitMQ 这样的非 HTTP 服务。
端口和地址:listen 5672 表示对外暴露的端口,而 server ip:5672 则指定了后端 RabbitMQ 服务的 IP 地址和端口。
注意事项:
确保你的 Nginx 配置支持 stream 模块(某些 Nginx 编译版本可能没有启用该模块)。
如果你的 RabbitMQ 服务有多个实例,你可以在 upstream 中添加多个服务器地址,以实现负载均衡。
你可能需要为 Nginx 配置 TLS(通过 ssl 配置)来加密流量,尤其是生产环境中,RabbitMQ 可能会使用加密的连接。
通过这种方式,Nginx 将在网络层代理 RabbitMQ 的流量,而不需要了解 RabbitMQ 的内部协议。

12-08 12:20