Nginx反向代理WebSocket报426 Upgrade Required错误如何解决
问题根因
你贴出的请求头属于普通HTTP GET请求,不是标准WebSocket连接请求,缺少WebSocket协议要求的Upgrade: websocket、Connection: Upgrade、Sec-WebSocket-Key等必填请求头,所以后端Ratchet服务直接返回426 Upgrade Required要求协议升级,属于预期行为。
修复步骤
1. 修正Nginx反向代理配置
将/chat路径的匹配规则从正则匹配改为前缀匹配,避免被后续静态资源正则规则拦截:
# 替换原有location ~ ^/chat 配置段 location ^~ /chat { proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Port $server_port; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:50500; # 替换0.0.0.0为127.0.0.1安全性更高 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_read_timeout 300s; proxy_buffering off; }
修改完成后执行nginx -t检查配置合法性,确认无报错后执行nginx -s reload重载配置。
2. 修正WebSocket连接地址
聊天服务通过Nginx反向代理对外提供服务,仅开放了443/80端口,不要直接连接后端50500端口:
- 前端WebSocket连接地址统一使用
wss://example.com/chat,不要额外加端口号 - 禁止直接在浏览器地址栏输入
https://example.com/chat访问,地址栏发起的是普通HTTP请求,不是WebSocket请求,必然返回426错误
3. 修正后端服务配置
你本地监听的是无SSL的HTTP端口,所以保持proxy_pass为http协议即可,不要改成https,否则会出现504超时。SOCKET_CHAT_URL配置不需要携带端口,前端统一走Nginx 443端口代理即可。
验证排查方法
在服务器本地执行以下命令验证后端WebSocket服务是否正常:
curl -i -N \ -H "Connection: Upgrade" \ -H "Upgrade: websocket" \ -H "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==" \ -H "Sec-WebSocket-Version: 13" \ http://127.0.0.1:50500
如果返回101 Switching Protocols说明后端服务正常,问题出在Nginx配置或前端连接逻辑;如果返回报错,先检查聊天服务是否正常启动、50500端口是否正常监听。
内容的提问来源于stack exchange,提问作者Ojin
相关产品推荐
相关产品推荐

