You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 17:54:03