起因

再重新部署斗地主项目的过程中发现,在本地测试时 WebSocket 连接没有问题。

而在线上使用 Nginx 反向代理后发现,后端服务其他接口均正常,只有 WebSocket 地址出现连接错误:

排除 token 无效的情况之后,以及请求头也携带了必要的 WebSocket 协议升级的请求头,如:

所以问题就出现在 Nginx 反向代理时,走的仍然是 HTTP 协议,丢失了关键的两个升级头:

Connection: Upgrade
Upgrade: websocket

解决

定位原因之后,解决也非常简单,就是在连接的 uri 中重新携带上这两个 WebSocket 升级头(比如我这里的连接 uri 是 “/ws”)

location /ws {
    proxy_pass http://localhost:8085;
    proxy_set_header Upgrade websocket;
    proxy_set_header Connection Upgrade;
}