Uvicorn 能直接启用 HTTPS,但生产环境不推荐——需权衡安全、运维与性能;开发可命令行快速启动,生产应前置 Nginx 等反向代理统一管理 TLS。

Uvicorn 能直接启用 HTTPS,不需要额外反向代理——只要传对 --ssl-keyfile 和 --ssl-certfile,它就能跑起来。但生产环境是否该这么干,得看你的部署结构和安全要求。
用命令行启动 HTTPS 最简方式
这是开发或单机测试最快路径,Uvicorn 内置支持,无需改代码:
-
uvicorn main:app --ssl-keyfile=./key.pem --ssl-certfile=./cert.pem --port 443是最基础组合;端口 443 需要 root 权限,非 root 用户可改用--port 8443 - 证书必须是 PEM 格式;如果私钥带密码,必须加
--ssl-keyfile-password,否则 Uvicorn 启动失败并报错ValueError: Password was not given but private key is encrypted - 若用 Let's Encrypt,路径通常是
/etc/letsencrypt/live/example.com/fullchain.pem(证书)和privkey.pem(私钥),注意别把chain.pem当主证书传 - 不推荐在命令行里硬编码密码;生产环境应改用配置文件或环境变量(如通过
UVICORN_SSL_KEYFILE_PASSWORD)
在 Python 代码里调用 uvicorn.run() 配置 SSL
适合需要动态判断环境、加载不同证书路径的场景,但要注意:此方式无法热重载(reload=True)与多进程(workers>1)共存。
Uvicorn 0.52.1 是 Python ASGI Web 服务器,提供异步应用服务及 WebSocket 支持,常用于 FastAPI、Starlette 等应用的开发和部署。本下载为官方 PyPI 通用 wheel 包,可使用 pip 安装,并由包管理器处理所需依赖。
- 必须放在
if __name__ == "__main__":块内,否则多进程启动时会重复执行uvicorn.run() - 参数名和命令行一致,只是去掉了双横线:
ssl_keyfile、ssl_certfile、ssl_keyfile_password - 示例片段:
import uvicorn from fastapi import FastAPI app = FastAPI() if __name__ == "__main__": uvicorn.run( "main:app", host="0.0.0.0", port=8443, ssl_keyfile="./private.key", ssl_certfile="./certificate.crt", ssl_keyfile_password="secret123" ) - 若证书路径来自配置中心或环境变量,记得提前做存在性检查,否则报错
FileNotFoundError: [Errno 2] No such file or directory
Uvicorn 自带 SSL 不等于生产就安全
它能跑 HTTPS,但默认配置离生产就绪还有距离。几个关键点容易被跳过:
- TLS 版本太老:Uvicorn 默认用 TLS 1.2(
--ssl-version=2),建议显式设为--ssl-version=4(对应 TLS 1.3),避免降级攻击 - 加密套件宽松:不指定
--ssl-ciphers时会启用弱算法;推荐至少限制为ECDHE+AESGCM:ECDHE+CHACHA20,禁用 CBC 模式和 RSA 密钥交换 - 没有 OCSP Stapling 支持:Uvicorn 本身不提供证书状态实时验证,客户端需自行发起 OCSP 请求;如需此功能,必须前置 Nginx 或 Caddy
- 单向认证 ≠ 双向认证:只配
ssl_certfile和ssl_keyfile是单向;双向需额外加--ssl-ca-certs ca.pem --ssl-cert-reqs 2,但此时客户端证书信息不会透传到 FastAPI 的 request 对象中
为什么生产环境通常不直接用 Uvicorn 终止 TLS
不是不能,而是不推荐——Uvicorn 的 SSL 实现偏轻量,缺少企业级 TLS 管理能力。
- Nginx 可集中管理多个域名的证书自动续期(配合 certbot)、支持 SNI、提供连接缓冲和限速,Uvicorn 做不到
- Uvicorn 多进程下每个 worker 都要独立加载证书和私钥,内存开销翻倍;Nginx 单进程管理 TLS,后端走 HTTP 明文更高效
- 日志和监控粒度更细:Nginx 可记录 TLS 版本、加密套件、握手耗时;Uvicorn 日志里只有连接建立/断开,看不到这些细节
- 若你已在用 Nginx 做反代,再让 Uvicorn 开 SSL 就是冗余加密,反而增加延迟和调试复杂度
真正难的不是“怎么配”,而是“配完之后谁来轮换证书、谁来监控过期、谁来处理吊销列表”。Uvicorn 的 SSL 是个可用的起点,但别把它当成终点。

















