Nginx反向代理支持WebSocket需透传协议升级头并保持长连接:必须配置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),禁用缓存,跨域头由后端在101响应中返回。

要让 Nginx 反向代理正确支持 WebSocket 跨域连接,关键不是简单加 Access-Control-Allow-Origin,而是必须透传 WebSocket 协议升级请求,并保持长连接不被中断。
确保 WebSocket 升级头被完整转发
WebSocket 建立依赖 HTTP 的 Upgrade: websocket 和 Connection: Upgrade 头。Nginx 默认可能丢弃或改写这些头,需显式配置:
- proxy_http_version 1.1; —— 必须设为 1.1,HTTP/1.0 不支持 Upgrade
- proxy_set_header Upgrade $http_upgrade; —— 将客户端的 Upgrade 头原样传给后端
-
proxy_set_header Connection "upgrade"; —— 固定设为
upgrade,而非继承客户端的 Connection 值(如 keep-alive)
禁用缓冲和超时干扰长连接
WebSocket 是全双工长连接,Nginx 默认的缓冲和超时策略会主动断开连接:
- proxy_buffering off; —— 关闭响应缓冲,避免阻塞实时帧
- proxy_read_timeout 86400; —— 设为大值(如 24 小时),防止空闲时被断连
- proxy_send_timeout 86400; —— 同上,保障双向心跳可送达
- 避免设置
proxy_cache相关指令 —— WebSocket 消息不可缓存
跨域控制由后端决定,Nginx 仅透传
WebSocket 协议本身不校验跨域(浏览器只在发起 HTTP 握手阶段检查 CORS),所以:
-
不要在 Nginx 层加
add_header Access-Control-Allow-Origin "*";—— 这对 WebSocket 握手无效,且可能干扰后端返回 - CORS 响应头(如
Access-Control-Allow-Origin、Access-Control-Allow-Credentials)应由后端服务在 HTTP 101 Switching Protocols 响应中返回 - 若后端已正确返回,Nginx 默认会透传这些头;如需强制透传,可加
proxy_pass_request_headers on;(默认即开启)
典型 location 配置示例
假设后端 WebSocket 服务运行在 http://localhost:8080/ws,前端通过 /ws 访问:
location /ws {
proxy_pass http://localhost:8080/ws;
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;
}
注意:路径结尾斜杠需与后端严格一致(如后端是 /ws/,这里也应写 /ws/ 并保持 proxy_pass 结尾一致,避免重写出错)。

















