websocket握手失败主因是nginx未正确配置协议升级支持,需设置proxy_http_version 1.1、proxy_set_header upgrade $http_upgrade;、proxy_set_header connection "upgrade";及proxy_read_timeout等超时参数。

WebSocket 连接在 Nginx 代理下握手失败,通常不是后端服务的问题,而是 Nginx 缺少必要的协议升级支持。关键在于显式启用 WebSocket 协议协商所需的 HTTP 头和连接保持机制。
必须设置的三个核心 Header
Nginx 默认不会透传或设置 WebSocket 握手所需的关键请求头,需手动添加:
-
Upgrade:值必须为
websocket,且需从客户端原样传递到上游 -
Connection:值应为
upgrade,不能被 Nginx 改写或丢弃 - Sec-WebSocket-Key 和 Sec-WebSocket-Version:这些由浏览器自动携带,Nginx 不应过滤或修改
location 块中启用 proxy_http_version 1.1
HTTP/1.0 不支持 Connection: upgrade,必须强制使用 HTTP/1.1:
- 在对应 location 中添加
proxy_http_version 1.1; - 搭配
proxy_set_header Upgrade $http_upgrade;动态传递 Upgrade 头 - 同时写
proxy_set_header Connection "upgrade";(注意加引号,避免被解析为指令)
避免超时中断长连接
WebSocket 是长连接,Nginx 默认的超时配置会主动断开:
- 设置
proxy_read_timeout 86400;(或更大值),防止空闲期间被关闭 - 可选设置
proxy_send_timeout 86400;,尤其在服务端延迟发送 ping/pong 时有用 - 不要依赖
keepalive_timeout,它只影响 HTTP 短连接复用,对 WebSocket 无效
检查是否被中间层干扰
若仍失败,排查链路中其他组件:
- CDN 或负载均衡器可能剥离 Upgrade/Connection 头,需确认其 WebSocket 支持开关已开启
- 防火墙或安全组未拦截 WebSocket 的 101 Switching Protocols 响应
- 浏览器开发者工具 Network 标签页查看请求状态码:200 表示未升级成功,101 才是正确握手











