折腾了一下午Nginx反代WebSocket,最后发现是个特别蠢的问题,写出来给大家提个醒。 事情是这样的,我有个小项目,前端用WebSocket跟后端通信,本地开发的时候一切正常,一放到服务器上通过Nginx反代就老是断连,浏览器控制台报错说WebSocket连接失败,一会儿连上一会儿断开,特别不稳定。 一开始我以为是代码问题,检查了好半天后端逻辑,甚至怀疑是不是防火墙或者服务器安全组没放行端口,结果都不是。后来打开Nginx的error.log,发现一堆关于upgrade的报错,这才反应过来是Nginx配置里少了关键的请求头。 其实Nginx反代WebSocket的核心就两句话,需要在location块里加上: proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \"upgrade\"; 这两行是为了让Nginx把HTTP升级请求转发给后端,如果不加,Nginx默认会把Connection头去掉,导致WebSocket握手失败。我之前的配置里只写了常见的Host和X-Real-IP,完全没意识到还要单独处理Upgrade头。