FastAPI扩展:ASGI 服务器Uvicorn

7 阅读4分钟

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:appjava -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-aliveKeep-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 不工作?

可能原因

  1. 文件编码问题(确保 UTF-8)
  2. 文件路径问题(确保在当前目录)
  3. 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: 如何优雅停止服务?

方法

  1. Ctrl+C(前台运行)
  2. 发送 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. 小测试

测试题

  1. 如果你要在 8888 端口运行 api.py 文件中的 fastapi_app 变量,命令是什么?
  2. 开发环境和生产环境都能用 --reload 参数吗?为什么?
  3. uvicorn 在 Python Web 开发中的作用,类比到 Java Spring Boot 是什么?

答案

点击查看答案
  1. 命令

    uvicorn api:fastapi_app --port 8888
    
  2. 不能。生产环境使用 --reload 会:

    • 降低性能
    • 增加安全风险
    • 可能导致服务不稳定
  3. 类比

    • uvicorn ≈ 内嵌 Tomcat/Jetty
    • 都是运行 Web 应用的容器
    • 负责处理 HTTP 请求、线程管理等

9. 参考资源


`