uvicorn 默认不支持 http/2,因其核心协议栈(httptools + asyncio)仅实现 http/1.1,--http httpcore 等参数在 0.29 前无效;http/2 必须 tls 加密且需换用 hypercorn 或 nginx 反代。

Uvicorn 当前不原生支持 HTTP/2 协议,直接启动时无论加不加 --http httpcore 或其他参数,只要底层没换协议栈,就只会跑 HTTP/1.1。
为什么 uvicorn run 默认不走 HTTP/2
Uvicorn 的核心协议实现默认绑定的是 httptools(HTTP/1.1 解析器)和标准 asyncio 事件循环,二者都不处理 HTTP/2 帧解析或流复用逻辑。即使你传了 --http httpcore,这个选项在 uvicorn 0.29 及之前版本中只是占位符,实际未启用——它会被忽略,服务器仍以 HTTP/1.1 响应。
常见错误现象:curl -I --http2 https://localhost:8000 返回 HTTP/1.1 200 OK;浏览器开发者工具 Network 面板显示协议列为 h2 失败,始终 fallback 到 http/1.1。
- HTTP/2 必须依赖 TLS(即 HTTPS),明文 HTTP/2(h2c)在 uvicorn 中完全不支持
- Uvicorn 官方明确将 HTTP/2 列为「planned but not implemented」,截至 2026 年 10 月仍无稳定支持路径
- 某些文档里提到的
--http h2或--http httpcore是误导性写法,不是有效参数
想用 HTTP/2?得换服务器,不是调参数
如果你的应用需要 HTTP/2(比如 Server Push、头部压缩、真正的多路复用),不要在 uvicorn 上硬扛。可行路径只有两个:
Uvicorn 0.52.1 是 Python ASGI Web 服务器,提供异步应用服务及 WebSocket 支持,常用于 FastAPI、Starlette 等应用的开发和部署。本下载为官方 PyPI 通用 wheel 包,可使用 pip 安装,并由包管理器处理所需依赖。
- 用
hypercorn:它原生支持 HTTP/2(需hypercorn[standard]+ OpenSSL 1.1.1+),命令形如hypercorn main:app --bind 'https://0.0.0.0:443' --certfile cert.pem --keyfile key.pem --http2 - 用 Nginx 做反向代理:把 uvicorn 暴露在本地 HTTP/1.1(如
127.0.0.1:8000),Nginx 开启http2并终止 TLS,对外提供 HTTP/2 连接——这是生产环境最稳妥的做法
注意:uvicorn[standard] 装的 uvloop 和 httptools 对 HTTP/2 没有任何加成,别被“standard”字面意思骗了。
HTTP/3 更不能指望 uvicorn 直接支持
虽然 uvicorn 0.24+ 加了 --enable-http3 参数,但它本质是把 QUIC 层委托给 hypercorn 或 quart 的底层实现,并非 uvicorn 自研。实际运行时会报 RuntimeError: HTTP/3 requires hypercorn or other QUIC-capable ASGI server ——也就是说,--enable-http3 只是个开关,背后必须有另一个服务器进程接管。
换句话说,uvicorn 的 HTTP/3 支持是“名义上的”,你得额外部署 hypercorn 或使用 uvicorn[http3](该 extra 实际安装的是 hypercorn 依赖,而非增强 uvicorn 本体)。
真正容易被忽略的一点:HTTP/2 和 HTTP/3 都要求 TLS 1.3,而很多自签名证书或旧 OpenSSL 版本生成的证书不满足 ALPN 协商条件,会导致协议降级静默失败,连错误日志都不打——务必用 openssl s_client -alpn h2 -connect localhost:443 手动验证。










