Windows下Nginx需手动配置才能支持WebSocket,关键包括设置proxy_http_version 1.1、Upgrade和Connection头、禁用缓存及延长read/send超时至86400秒,并确保使用1.15.0+官方稳定版。

Windows 下 Nginx 默认不启用 WebSocket 支持,需手动配置反向代理的 HTTP 头和超时参数才能正常转发 WebSocket 连接(如 ws:// 或 wss://)。关键在于升级协议头、禁用缓存、延长连接保持时间。
确保 Nginx 版本支持 WebSocket
Nginx 1.3.13+ 已原生支持 WebSocket 协议升级(基于 Upgrade 和 Connection 头),Windows 官方编译版从 1.15.0 起稳定可用。建议使用 nginx.org 官网最新稳定版(如 1.24.x),避免第三方打包版缺少模块或配置异常。
修改 nginx.conf 启用 WebSocket 代理
在 location 块中添加以下必要头字段和超时设置(以代理本地 Node.js 的 WebSocket 服务 http://127.0.0.1:3000 为例):
注意:必须同时设置 Upgrade 和 Connection,且 proxy_http_version 必须为 1.1
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_read_timeout 86400;(长连接保持时间,建议设大些,避免频繁断连) proxy_send_timeout 86400;
完整示例:
server {
listen 80;
server_name localhost;
location /ws/ {
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_read_timeout 86400;
proxy_send_timeout 86400;
}
}
测试 WebSocket 是否成功透传
启动后重启 Nginx(nginx -s reload),再用以下方式验证:
- 浏览器控制台运行 JS 测试连接:
const ws = new WebSocket("ws://localhost/ws/");<br> ws.onopen = () => console.log("Connected");<br> ws.onerror = e => console.error("Error", e); - 检查浏览器开发者工具 Network → WS 标签页,确认状态为 101 Switching Protocols(不是 200 或失败)
- 查看 Nginx error.log,无
upstream prematurely closed connection类报错 - 后端服务日志应收到 upgrade 请求并建立长连接(例如 Socket.IO 会打印
client connected)
常见问题排查
若连接失败,优先检查这几项:
- 后端服务是否监听
0.0.0.0(而非仅127.0.0.1),确保可被 Nginx 访问 - Windows 防火墙或安全软件是否拦截了 Nginx 的出站连接(尤其对本地端口)
- URL 路径是否匹配:前端
ws://localhost/ws/必须与 Nginxlocation /ws/一致,末尾斜杠要对应 - 若用 HTTPS + WSS,需确保 SSL 配置正确,且后端支持 TLS;Nginx 不需要额外 WebSocket 配置,但证书必须有效
不复杂但容易忽略。










