必须在location块中配置proxy_http_version 1.1,因其仅对该location下的proxy_pass生效;若置于http或server块则无效,且须配合Upgrade和Connection头,否则HTTP/1.0不支持升级导致握手失败。

必须在处理 WebSocket 请求的 location 块中显式设置 proxy_http_version 1.1;,否则 Nginx 默认用 HTTP/1.0 转发,导致握手失败。
为什么一定要写在 location 里
这个指令不是全局生效的,它只对当前 location 下的 proxy_pass 生效。如果只写在 server 或 http 块里,不会传递到具体代理路径上。WebSocket 握手依赖 HTTP/1.1 的 Upgrade 和 Connection 头机制,HTTP/1.0 不支持协议升级,Nginx 会直接断开连接或返回 502。
典型配置位置示例
以下写法是正确且必要的:
阿里百炼大模型平台多人共享账号用量统计代理服务。解决公司共用账号时无法区分个人用量的问题。适用场景:1)部署用量统计代理;2)统计多人Token用量和调用次数;3)管理大模型API调用配额。
- 匹配 WebSocket 路径(如
/ws、/api/ws、/socket.io)的 location 块内 - 紧邻
proxy_pass指令下方,避免被其他配置覆盖 - 不与
http2共存——若该 server 启用了listen 443 ssl http2,WebSocket 必须走独立配置(如子域名或端口),否则无法触发升级
常见错误写法
这些看似合理,实际无效:
-
http { proxy_http_version 1.1; }—— 不作用于任何 proxy_pass -
server { proxy_http_version 1.1; }—— 未绑定到具体 location,不生效 - 只写
proxy_http_version 1.1;,但漏掉proxy_set_header Upgrade $http_upgrade;和proxy_set_header Connection "upgrade";—— 协议版本对了,头没传,后端收不到升级意图
验证是否真正启用
仅看 Nginx 配置文件写对了不够,要实测确认:
- 浏览器 Network 标签中 WebSocket 连接的 Protocol 显示 websocket,状态码为 101 Switching Protocols
- 用 curl 模拟握手:
curl -i -k -H "Connection: Upgrade" -H "Upgrade: websocket" https://yourdomain.com/ws,响应头中必须含HTTP/1.1 101和Upgrade: websocket - Nginx error.log 中无
upstream sent no valid HTTP/1.0 header类报错










