You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Nginx新手求助:如何实现TCP/WebSocket代理(附HTTP代理配置)

搞定Nginx的WebSocket和TCP代理问题

嗨,我明白你现在的困惑——刚搞定HTTP反向代理,想拓展到WebSocket或者TCP代理就卡壳了是吧?别着急,这俩的配置逻辑和HTTP确实不一样,我给你一步步拆解清楚:

一、WebSocket代理:不用改HTTP块,加几个请求头就行

WebSocket是基于HTTP握手升级的协议,所以完全可以在你现有的http{}块里配置,只要在location中补充几个关键的请求头,让Nginx正确识别并转发WebSocket请求:

修改你原来的HTTP配置,加上这些指令:

user nginx;
events { worker_connections 5000; }
http {
    upstream backends {
        server 127.0.0.1:8083;
        server 172.16.0.16:8083;
    }
    server {
        listen 12345;
        location / {
            proxy_pass http://backends;
            # 以下是WebSocket必须的配置
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
        }
    }
}
  • proxy_http_version 1.1:WebSocket需要HTTP/1.1协议支持
  • UpgradeConnection头:告诉后端服务器这是一个WebSocket升级请求
  • Host头:保证后端能正确识别请求的主机名

这样配置后,Nginx就能自动处理WebSocket的握手和后续的双向数据流转发了,不用额外开新端口(除非你想单独给WebSocket分配端口)。

二、TCP代理:需要启用Stream模块,配置和HTTP同级

TCP代理属于四层代理,Nginx需要启用stream模块才能支持——很多默认安装的Nginx可能没编译这个模块,先检查一下:

nginx -V

看输出里有没有--with-stream参数,如果没有,你需要重新编译Nginx并加上这个参数,或者安装带stream模块的包(比如Debian/Ubuntu下的nginx-full)。

确认模块可用后,在你的Nginx配置中添加stream{}块(和http{}events{}同级,不是替换http{}):

user nginx;
events { worker_connections 5000; }

# 保留你原来的HTTP代理配置
http {
    upstream backends {
        server 127.0.0.1:8083;
        server 172.16.0.16:8083;
    }
    server {
        listen 12345;
        location / {
            proxy_pass http://backends;
        }
    }
}

# 新增TCP代理配置
stream {
    upstream tcp_backends {
        server 127.0.0.1:8083;
        server 172.16.0.16:8083;
    }
    server {
        listen 12346; # 给TCP代理分配一个独立端口
        proxy_pass tcp_backends;
    }
}
  • stream{}块专门处理四层(TCP/UDP)流量,语法和http{}类似,但没有location这些七层概念
  • 你可以给TCP代理分配一个新端口(比如上面的12346),避免和HTTP代理端口冲突
  • 如果要代理UDP,只要把listen改成listen 12346 udp;就行

为什么你之前的尝试失败?

  • 直接把http{}换成tcp{}是错误的:Nginx里没有tcp{}这个块,四层代理是用stream{}实现的
  • proxy_pass本身支持tcp://,但必须在stream{}块里使用,在http{}块里只能用http://https://

这样调整之后,WebSocket和TCP代理应该就能正常工作了,有问题再随时问哈!

内容的提问来源于stack exchange,提问作者enator

火山引擎 最新活动