起因
再重新部署斗地主项目的过程中发现,在本地测试时 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;
}