Uvicorn 快速入门指南
📖 目录
1. uvicorn 是什么?
官方定义
uvicorn 是一个 ASGI 服务器,用于运行 Python 异步 Web 应用(如 FastAPI)。
🌟 生活化比喻
FastAPI 应用 = 一辆跑车🏎️ uvicorn = 发动机🔧
没有 uvicorn,FastAPI 就跑不起来!
| Python (FastAPI) | Java (Spring Boot) | 说明 |
|---|---|---|
| FastAPI 代码 | Spring Boot 应用代码 | 业务逻辑 |
| uvicorn | 内嵌 Tomcat/Jetty | 运行容器 |
uvicorn main:app | java -jar app.jar | 启动命令 |
2. 命令格式
📝 基本语法
uvicorn 主模块:应用实例 [选项]
示例:
# 运行 main.py 中的 app 变量
uvicorn main:app
# 运行 test_app.py 中的 my_app 变量
uvicorn test_app:my_app
说明:
主模块= Python 文件名(不带 .py 扩展)应用实例= FastAPI() 赋值给的变量名
3. 常用命令
3.1 基础运行
# 默认端口 8000
uvicorn main:app
3.2 开发模式(自动重载)
uvicorn main:app --reload
特点:
- ✅ 代码变化自动重启
- ✅ 适合本地开发调试
- ❌ 生产环境禁用(影响性能)
3.3 指定主机和端口
uvicorn main:app --host 0.0.0.0 --port 8000
参数说明:
--host 0.0.0.0= 允许任何 IP 访问--host 127.0.0.1= 仅本地访问--port 8080= 自定义端口
3.4 多工作进程
uvicorn main:app --workers 4
说明:
- 提高并发处理能力
- 类似 Tomcat 的线程池概念
- 生产环境推荐配置
3.5 日志级别
uvicorn main:app --log-level info
可选值:
debug- 调试信息(最详细)info- 一般信息warning- 警告信息error- 错误信息critical- 严重错误
3.6 HTTPS 配置
uvicorn main:app \
--ssl-keyfile=./key.pem \
--ssl-certfile=./cert.pem
4. 参数速查表
| 参数 | 简写 | 说明 | 默认值 | 示例 |
|---|---|---|---|---|
--host | -h | 绑定地址 | 127.0.0.1 | --host=0.0.0.0 |
--port | -p | 端口号 | 8000 | --port=8080 |
--reload | 开发模式自动重载 | False | --reload | |
--workers | 工作进程数 | 1 | --workers=4 | |
--log-level | 日志级别 | info | --log-level=debug | |
--access-log | 启用访问日志 | True | --no-access-log | |
--loop | 事件循环实现 | auto | --loop=asyncio | |
--limit-concurrency | 最大并发连接数 | 无限制 | --limit-concurrency=100 | |
--timeout-keep-alive | Keep-alive 超时时间 | 5秒 | --timeout-keep-alive=30 |
5. 实战场景
场景 1:本地开发调试
cd e:\desktop\03-项目_掌柜问数\3.代码\data-agent\data-agent
uvicorn main:app --reload
访问地址:
特点:
- 代码修改自动重启
- 详细的日志输出
- 适合单人开发
场景 2:局域网演示
uvicorn main:app --host 0.0.0.0 --port 8000 --reload
获取本机 IP:
ipconfig
访问地址:
特点:
- 局域网内可访问
- 适合团队演示、测试
场景 3:生产环境部署
方案 A:直接使用 uvicorn
uvicorn main:app \
--host 0.0.0.0 \
--port 8000 \
--workers 4 \
--log-level warning
方案 B:使用 Gunicorn 管理(推荐)
gunicorn main:app \
-w 4 \
-k uvicorn.workers.UvicornWorker \
--bind 0.0.0.0:8000
特点:
- 多工作进程
- 禁用自动重载
- 精简日志级别
- 高性能配置
场景 4:调试模式
uvicorn main:app --reload --log-level debug
用途:
- 查看详细的请求/响应信息
- 排查问题
- 学习框架内部机制
6. 常见问题
Q1: 端口被占用怎么办?
错误信息:
OSError: [Errno 48] Address already in use
解决方案:
# 方法 1:换端口
uvicorn main:app --port 8001
# 方法 2:杀掉占用进程(Linux/Mac)
lsof -ti:8000 | xargs kill -9
# 方法 3:Windows 查看占用端口
netstat -ano | findstr :8000
Q2: --reload 不工作?
可能原因:
- 文件编码问题(确保 UTF-8)
- 文件路径问题(确保在当前目录)
- Python 缓存问题
解决方案:
# 清除缓存
find . -type d -name __pycache__ -exec rm -rf {} +
find . -type f -name "*.pyc" -delete
# 重新启动
uvicorn main:app --reload
Q3: 如何后台运行?
Linux/Mac:
nohup uvicorn main:app --host 0.0.0.0 --port 8000 &
Windows PowerShell:
Start-Process python -ArgumentList "-m","uvicorn","main:app","--host","0.0.0.0","--port","8000"
使用 tmux/screen(推荐):
tmux new -s fastapi
uvicorn main:app --host 0.0.0.0 --port 8000
# 按 Ctrl+B 然后 D 脱离会话
Q4: 如何优雅停止服务?
方法:
- 按
Ctrl+C(前台运行) - 发送 SIGTERM 信号(后台运行)
查找进程 ID:
ps aux | grep uvicorn
停止进程:
kill -15 <PID>
7. 最佳实践
✅ 开发环境
uvicorn main:app --reload --log-level debug
✅ 测试环境
uvicorn main:app --host 0.0.0.0 --port 8000 --workers 2
✅ 生产环境
# 使用 systemd 或 supervisor 管理
gunicorn main:app \
-w 4 \
-k uvicorn.workers.UvicornWorker \
--bind 0.0.0.0:8000 \
--timeout 120 \
--access-logfile /var/log/app/access.log \
--error-logfile /var/log/app/error.log
8. 小测试
测试题
- 如果你要在 8888 端口运行
api.py文件中的fastapi_app变量,命令是什么? - 开发环境和生产环境都能用
--reload参数吗?为什么? - uvicorn 在 Python Web 开发中的作用,类比到 Java Spring Boot 是什么?
答案
点击查看答案
-
命令:
uvicorn api:fastapi_app --port 8888 -
不能。生产环境使用
--reload会:- 降低性能
- 增加安全风险
- 可能导致服务不稳定
-
类比:
- uvicorn ≈ 内嵌 Tomcat/Jetty
- 都是运行 Web 应用的容器
- 负责处理 HTTP 请求、线程管理等
9. 参考资源
- 官方文档: www.uvicorn.org/
- GitHub: github.com/encode/uvic…
- FastAPI 文档: fastapi.tiangolo.com/
`