uvicorn 在生产环境的角色
作用:uvicorn 是 应用服务器(ASGI server)
用途:直接运行你的 FastAPI 应用,处理 HTTP 请求、WebSocket、API 调用。
特点:高性能、异步、支持并发,但 不处理静态文件、反向代理、HTTPS/TLS、负载均衡。
也就是说,uvicorn 可以直接服务客户端,但不是完整的 Web 服务器解决方案。
Apache / Nginx 在生产环境的角色
作用:反向代理服务器、静态文件服务器、负载均衡器
用途:
- 处理 HTTPS/TLS(SSL 证书)
- 处理静态资源(图片、JS、CSS)
- 负载均衡多个 uvicorn 进程
- 限制请求速率、处理压缩、缓存
uvicorn 和 gunicorn、nginx 的区别
| 工具 | 位置 | 作用 |
|---|---|---|
| uvicorn | 应用服务器 | 直接运行 FastAPI |
| gunicorn | 进程管理器 | 可配合 uvicorn 托管多个进程 |
| nginx | 反向代理 / 静态文件服务器 | 负责分发请求、负载均衡 |
实际环境:Apache + uvicorn
Apache + uvicorn 配合使用时,Apache 做反向代理和 HTTPS,uvicorn 专注运行 FastAPI 应用,生产环境常用这种组合。
工作原理:
客户端 → Apache (80/443) → uvicorn (127.0.0.1:8000) → FastAPI 应用
- Apache:监听 80/443,处理 HTTPS、静态文件、防火墙、访问控制等
- uvicorn:运行 FastAPI 应用,处理业务逻辑、API、WebSocket
- mod_proxy:Apache 模块,用于转发请求到 uvicorn
Apache 必须启用模块:
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_wstunnel # 如果使用 WebSocket
sudo a2enmod headers
sudo a2enmod rewrite
sudo systemctl restart apache2
Apache 配置示例(反向代理):
<VirtualHost *:80>
ServerName yourdomain.com
# HTTP 转发到 uvicorn
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8000/
ProxyPassReverse / http://127.0.0.1:8000/
# 如果有 WebSocket
ProxyPass /ws/ ws://127.0.0.1:8000/ws/
ProxyPassReverse /ws/ ws://127.0.0.1:8000/ws/
</VirtualHost>
FastAPI + uvicorn 启动示例:
uvicorn app.main:app –host 127.0.0.1 –port 8000
说明:
- 127.0.0.1:8000 → 只允许本机访问,由 Apache 转发外部请求
- 外部用户访问 http://yourdomain.com,Apache 会把请求转给 uvicorn
启用 HTTPS(可选):
推荐在 Apache 层做 HTTPS,uvicorn 只处理 HTTP。
<VirtualHost *:443>
ServerName yourdomain.com
SSLEngine on
SSLCertificateFile /path/to/cert.pem
SSLCertificateKeyFile /path/to/key.pem
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8000/
ProxyPassReverse / http://127.0.0.1:8000/
</VirtualHost>