要让Nginx基于端口的虚拟主机正确转发WebSocket请求,必须显式配置HTTP/1.1升级头、禁用缓冲并调大超时值:设置proxy_http_version 1.1、proxy_set_header Upgrade $http_upgrade、proxy_set_header Connection "upgrade"、proxy_buffering off、proxy_read_timeout和proxy_send_timeout为86400。

要让 Nginx 基于端口的虚拟主机正确转发 WebSocket 请求,核心是满足 WebSocket 协议升级(Upgrade)机制,并确保连接不被代理中断。仅靠监听不同端口还不够,必须显式处理 Upgrade 和 Connection 头,同时关闭缓冲和超时干扰。
配置监听端口并启用 WebSocket 升级头
Nginx 默认不会透传 Upgrade 和 Connection 请求头,需在 location 块中手动设置:
- 添加
proxy_http_version 1.1;—— WebSocket 依赖 HTTP/1.1 的协议升级能力 - 设置
proxy_set_header Upgrade $http_upgrade;—— 将客户端发起的 Upgrade 请求头(如websocket)原样传递给后端 - 设置
proxy_set_header Connection "upgrade";—— 显式告诉后端本次连接意图升级,而非普通 HTTP
禁用代理缓冲与调整超时时间
WebSocket 是长连接,Nginx 默认的缓冲和超时策略会主动断开空闲连接:
- 添加
proxy_buffering off;—— 防止 Nginx 缓存响应导致消息延迟或粘包 - 设置
proxy_read_timeout 86400;(或更大值)—— 延长读取超时,避免心跳间隔触发断连 - 可选添加
proxy_send_timeout 86400;—— 匹配发送侧超时,保持双向长连接稳定
基于端口的 server 块完整示例
以下是一个监听 8080 端口、反向代理本地 WebSocket 服务(如 ws://127.0.0.1:3000)的典型配置:
server {
listen 8080;
server_name _;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffering off;
proxy_read_timeout 86400;
proxy_send_timeout 86400;
}
}
若需多个端口对应不同后端(如 8081 → 3001,8082 → 3002),只需复制 server 块,修改 listen 和 proxy_pass 即可。
验证与常见问题排查
配置生效后,可通过浏览器控制台或 curl 检查关键响应头是否返回:
- 客户端发起 WebSocket 连接(如
new WebSocket("ws://your-domain:8080/")) - 检查 Network 面板中 WebSocket 握手请求的响应头:应含
Upgrade: websocket和Connection: upgrade - 若报错
Error during WebSocket handshake: Unexpected response code: 200,说明 Nginx 未成功升级协议,大概率是Upgrade/Connection头未透传或后端未响应升级 - 若连接秒断,检查
proxy_read_timeout是否过小,或后端是否拒绝了带 upgrade 头的请求


















