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协议支持Upgrade和Connection头:告诉后端服务器这是一个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




