必须在location块中显式设置proxy_http_version 1.1,否则WebSocket握手失败;因HTTP/1.0不支持Upgrade机制,Nginx默认用1.0转发会导致协议升级被拒绝,且该指令必须与proxy_set_header Upgrade $http_upgrade、proxy_set_header Connection "upgrade"及proxy_read_timeout 86400配合使用才有效。

必须在 location 块中显式设置 proxy_http_version 1.1,否则 WebSocket 握手会失败。HTTP/1.0 不支持 Upgrade 机制,Nginx 默认用的就是 1.0,不改就会直接拒绝协议升级请求。
为什么一定要设成 1.1
WebSocket 握手本质是 HTTP 协议的一次“升级请求”,客户端发 Upgrade: websocket 和 Connection: Upgrade,服务端回 101 Switching Protocols。这个流程只有 HTTP/1.1 支持,1.0 没有 Upgrade 能力,Nginx 也不会透传相关头部。
配置位置和写法
该指令不能放在 http 或 upstream 块里,必须出现在处理 WebSocket 请求的 location 中:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 写在
proxy_pass同一级,且要早于所有proxy_set_header - 值只能是
1.1,不能写1.0或留空 - 不区分大小写,但惯例全小写
配套必须加的配置
单设 proxy_http_version 1.1 还不够,必须同步配齐以下三项,否则仍会 400 或断连:
-
proxy_set_header Upgrade $http_upgrade;—— 把客户端原始的 Upgrade 头(比如 websocket、mqtt)传给后端 -
proxy_set_header Connection "upgrade";—— 注意是固定字符串 "upgrade",不是变量 -
proxy_read_timeout 86400;—— 防止空闲时被 Nginx 主动断开,建议设为 24 小时或略高于心跳间隔
常见错误写法
这些写法会导致 WebSocket 无法建立:
- 漏掉
proxy_http_version 1.1,只加了其他头 - 写成
proxy_http_version 1.0或proxy_http_version 2.0 - 把
Connection写成$connection_upgrade(旧文档误导) - 把
proxy_http_version放在upstream块里(无效)

















