介绍
Uvicorn 是一款高性能、轻量级 Python ASGI Web 服务器。
名称由来:UV(Ultra-Violet 紫外线)+ unicorn(独角兽),寓意极速异步服务器。
- 作者:Tom Christie(Starlette、ASGI 规范发起者)
- 协议:ASGI(异步服务器网关接口),对标同步世界的 WSGI
- 底层核心依赖:
uvloop:Cython 实现的高性能事件循环,替代 Python 标准asynciohttptools:C 实现的 HTTP 解析器(Node.js 同款解析内核)
适用框架
FastAPI、Starlette、Django Channels、Litestar 等异步 Web 框架。
ASGI vs WSGI 区别
| 类型 | 同步/异步 | 长连接(WebSocket) | 适用服务器 |
|---|---|---|---|
| WSGI | 纯同步 | ❌ 原生不支持 | Gunicorn、uWSGI |
| ASGI | 支持async/await | ✅ WebSocket、SSE、长轮询 | Uvicorn、Hypercorn、Daphne |
简单理解:
WSGI 只能一次性处理短 HTTP 请求;
ASGI 支持持续双向数据流,天然适配实时通信。
特性
原生异步高并发
单进程单事件循环,可以同时维持成千上万连接,I/O 等待时不会阻塞。非常适合接口服务、实时推送、WebSocket 聊天。支持 HTTP/1.1 + WebSocket
原生支持双向长连接,是开发实时应用首选。开发友好:代码热重载
--reload
文件变更自动重启服务,仅限本地调试,禁止生产使用。同时兼容异步/同步接口
可以运行async def接口,也能正常执行普通同步函数(内部自动线程池调度)。支持多进程、Unix Socket、SSL HTTPS、反向代理头部解析
- 轻量、启动速度快,配置简洁
局限:目前官方尚不原生支持 HTTP/2、HTTP/3;如需 HTTP/3 可以选择 Hypercorn。
安装
# 最简安装(不含uvloop、httptools,性能较低)
pip install uvicorn
# 推荐完整版,包含性能依赖【生产必选】
pip install uvicorn[standard]
要求 Python ≥3.10(新版本uvicorn)
基础使用方式
1. 命令行启动(最常用)
文件 main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def hello():
return {"msg":"hello uvicorn"}
启动命令格式:uvicorn 模块名:实例名
# 基础启动,仅本机访问
uvicorn main:app
# 允许外部访问,端口8000
uvicorn main:app --host 0.0.0.0 --port 8000
# 开发模式:开启热重载
uvicorn main:app --host 0.0.0.0 --port 8000 --reload
2. 代码内编程启动(uvicorn.run())
# main.py
import uvicorn
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"hello": "uvicorn program start"}
if __name__ == "__main__":
uvicorn.run(
"main:app",
host="0.0.0.0",
port=8000,
reload=False,
workers=1
)
⚠️ 坑:Windows下,多进程模式
workers>1不能搭配reload=True,会报错。
常用参数详解
uvicorn main:app \
--host 0.0.0.0 \ # 监听地址,0.0.0.0允许外网访问
--port 8000 \ # 端口
--workers 4 \ # 工作进程数量(多进程多核利用)
--loop uvloop \ # 事件循环,可选 uvloop / asyncio
--log-level info \ # 日志级别 critical/error/warning/info/debug
--access-log \ # 开启访问日志(生产可关闭提升性能)
--timeout-keep-alive 10 \ # HTTP长连接空闲超时
--graceful-timeout 30 \ # 优雅关闭等待时长
--limit-concurrency 2000 \ # 限制最大并发连接,防止雪崩
--proxy-headers \ # 解析Nginx反向代理传递的真实客户端IP
--ssl-certfile cert.pem \
--ssl-keyfile key.pem # HTTPS证书
参数说明
--reload
开发专用;启动额外监控进程,文件变动重启worker;生产环境必须关闭!严重损耗性能。--workers N
uvicorn 内置多进程模式。
- Linux/macOS:推荐
CPU核心数 ~ 2*核心数 - Windows:uvicorn 的多进程稳定性较差,Windows生产环境建议单worker,或者改用 Gunicorn。
注意:多进程之间内存隔离,全局变量不共享!
--loop
uvloop(默认):性能最高asyncio:兼容性模式,部分第三方库不兼容uvloop时使用
六、部署模式(重点区分开发 / 生产)
模式1:本地开发(简单)
uvicorn main:app --host 0.0.0.0 --port 8000 --reload
模式2:生产方案A —— 原生uvicorn多进程(简单部署)
uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4
优点:一条命令搞定;缺点:进程监控、平滑重启能力弱。
模式3:生产方案B —— Gunicorn + UvicornWorker【业界标准推荐】
Gunicorn 作为主进程管理器,管理多个 Uvicorn 异步 worker
pip install gunicorn
# 启动
gunicorn main:app \
-w 4 \
-k uvicorn.workers.UvicornWorker \
--bind 0.0.0.0:8000
-w 4:4个worker进程-k uvicorn.workers.UvicornWorker:使用uvicorn异步worker(支持ASGI/WebSocket)
✅ 优势:
成熟进程管理、自动重启崩溃进程、支持平滑重启、日志管理完善;Linux服务器首选。
架构标准链路:
Client → Nginx(反向代理、ssl、限流) → Gunicorn → UvicornWorker → FastAPI应用
七、Uvicorn 常见坑 & 最佳实践
1. 不要生产开启 --reload
自动重载会产生额外进程开销,存在安全风险。
2. 同步阻塞代码会拖垮整个事件循环
# ❌ 错误!同步耗时代码阻塞事件循环
import time
@app.get("/block")
async def test():
time.sleep(5)
# ✅ 正确:使用异步sleep
import asyncio
@app.get("/ok")
async def test():
await asyncio.sleep(5)
如果必须调用同步阻塞IO(数据库、请求),使用 asyncio.to_thread() 放到线程运行。
3. 多进程环境全局状态不共享
--workers>1 每个进程独立内存,不要依赖内存缓存;改用Redis等外部缓存。
4. Docker容器部署建议
容器中推荐单worker,由K8s/Docker Compose横向扩容,不要在容器内部开启多workers。
5. 反向代理必须开启 --proxy-headers
搭配Nginx时启用,才能正确获取客户端真实IP、请求协议。
八、同类 ASGI 服务器横向对比
- Uvicorn
性能最优,生态最好,FastAPI官方默认;仅支持HTTP/1.1 + WebSocket。 - Hypercorn
支持 HTTP/2、HTTP/3;性能略低于uvicorn。 - Daphne
Django Channels官方配套,纯Python解析,性能偏弱。
九、常见问题
Q:Uvicorn 和 Gunicorn 是什么关系?
- Gunicorn 原生是WSGI同步服务器,不支持ASGI
- 通过
UvicornWorker适配器,Gunicorn可以调度uvicorn进程,实现「进程管理+异步处理」组合。
Q:单进程uvicorn能利用多核CPU吗?
不能!asyncio事件循环单线程运行,一个worker只能占用一个CPU核心。
想要利用多核,必须启动多个worker进程(--workers 或gunicorn托管)。
十、极简生产标准启动模板(Linux)
# 搭配nginx反向代理
gunicorn main:app \
-w 3 \
-k uvicorn.workers.UvicornWorker \
--bind 127.0.0.1:8000 \
--proxy-headers \
--log-level warning
如果你需要,我可以给你一份配套的 Nginx 配置文件 + systemd 服务托管脚本,直接用于服务器上线部署。