nginx 代理 websocket 需显式启用协议升级并透传头:设 proxy_http_version 1.1,proxy_set_header upgrade $http_upgrade,proxy_set_header connection "upgrade";$http_upgrade 自动捕获客户端 upgrade 值,确保兼容性。

在 Nginx 中代理 WebSocket 连接时,Upgrade 头不是“写”出来的,而是由 Nginx 根据客户端请求自动识别并透传的关键控制头。你真正需要做的是:显式启用 WebSocket 协议升级支持,并正确转发 Connection 和 Upgrade 请求头。
必须设置的两个关键头字段
Nginx 默认会丢弃非标准头(如 Upgrade),也默认不处理 Connection: upgrade。要让 WebSocket 升级成功,需在 location 块中明确配置:
-
proxy_http_version 1.1;—— 强制使用 HTTP/1.1(WebSocket 升级依赖此版本) -
proxy_set_header Upgrade $http_upgrade;—— 将客户端的Upgrade头原样传给后端(值通常是websocket) -
proxy_set_header Connection "upgrade";—— 固定设为"upgrade"(注意带英文双引号,否则 Nginx 会尝试变量替换)
完整典型配置示例
假设后端 WebSocket 服务运行在 http://127.0.0.1:8080,路径为 /ws:
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
location /ws {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
其中 $http_upgrade 是 Nginx 内置变量,它会自动捕获客户端请求中的 Upgrade 头值(如 websocket),无需手动写死。
常见错误和验证方法
如果连接失败(如返回 400 或直接断开),检查以下几点:
- 确认客户端发起的是
GET /ws HTTP/1.1请求,且含Upgrade: websocket和Connection: upgrade - 确保没有遗漏
proxy_http_version 1.1—— 缺失会导致 Nginx 用 HTTP/1.0 转发,后端拒绝升级 - 不要写成
proxy_set_header Connection $http_connection;—— 后端通常只认字面量"upgrade",变量值可能被过滤或为空 - 用浏览器开发者工具的 Network 面板查看请求头,确认 Nginx 是否成功透传了
Upgrade和Connection
补充说明:为什么不能手动写死 Upgrade 值?
虽然看起来可以写 proxy_set_header Upgrade websocket;,但不推荐。因为:
– 某些客户端(如旧版库)可能发 Upgrade: Websocket(大小写不一致)
– 极少数场景下可能协商其他协议(如 h2c)
– 使用 $http_upgrade 能保持与客户端完全一致,更健壮










