大家好,我是jobleap.cn的小九。在生产环境下,我们不再简单地使用uvicorn main:app,而是需要考虑进程守护、多核并发、故障自启以及特权端口管理。
🛠 方案一:PM2 方案(最简单、全能)
PM2本是 Node.js 领域的顶流,但因其极简的命令行界面和强大的进程监控能力,现已成为 Python 开发者在 Linux 上部署 Web 服务的热门选择。
1. 安装与准备
# 安装 Node 环境及 PM2sudoaptupdate&&sudoaptinstallnodejsnpm-ysudonpminstall-g pm22. 启动 FastAPI
PM2 可以直接托管 uvicorn 进程。为了监听80 端口,命令前必须加sudo:
sudopm2 start"uvicorn main:app --host 0.0.0.0 --port 80"--name"fastapi-demo"3. 常用运维命令
| 功能 | 命令 |
|---|---|
| 查看所有服务状态 | sudo pm2 list |
| 查看实时日志 | sudo pm2 logs fastapi-demo |
| 重启服务 | sudo pm2 restart fastapi-demo |
| 开机自启 | sudo pm2 save && sudo pm2 startup |
🚀 方案二:Gunicorn + Uvicorn 方案(工业标准)
这是 Python 社区最正统的生产部署方式。Gunicorn负责管理进程(Master),Uvicorn负责处理异步请求(Worker)。这种组合兼顾了稳定性和异步高性能。
1. 安装依赖
pipinstallgunicorn uvicorn2. 启动命令
使用-k uvicorn.workers.UvicornWorker参数来启动异步工作流:
sudogunicorn main:app\--workers4\--worker-class uvicorn.workers.UvicornWorker\--bind0.0.0.0:80\--daemon--workers 4: 启动 4 个进程(建议设置为2 * CPU核心数 + 1)。--daemon: 在后台运行。
3. 如何停止 Gunicorn
由于 Gunicorn 是后台运行的,需要通过查找进程 ID 来关闭:
# 查找进程并杀死psaux|grepgunicornpkillgunicorn⚖️ PM2 vs Gunicorn 选型对比
| 特性 | PM2 | Gunicorn |
|---|---|---|
| 易用性 | 极高,像刷短视频一样简单 | 一般,需要配合 Systemd 使用 |
| 日志管理 | 自带精美日志面板,支持自动切割 | 需手动配置日志文件路径 |
| 监控 | 提供 CPU、内存实时可视化 | 需配合三方工具(如 Prometheus) |
| 适用人群 | 追求开发效率、全栈开发者 | 纯 Python 环境、追求极致底层的团队 |
🛡 生产环境的安全堡垒:Nginx 反向代理
在真正的生产环境中,我们通常不让Python 直接监听 80 端口,而是让 Nginx 监听 80,再转发给后端的 Python(如监听 8000 端口)。
这样做的好处:
- SSL 证书:Nginx 处理 HTTPS 极其方便。
- 静态资源:Nginx 处理图片、CSS 的速度远超 FastAPI。
- 安全性:隐藏真实的后端服务器信息。
🆘 常见报错排查
- 端口被占用:
运行sudo lsof -i :80。如果有输出,说明 80 端口被占用(通常是默认的 Nginx)。执行sudo systemctl stop nginx即可释放。 - 权限拒绝 (Permission Denied):
在 Linux 中,非 root 用户无法绑定 1024 以下端口。必须使用sudo启动。 - 代码更新不生效:
Git pull 完代码后,必须执行pm2 restart或pkill gunicorn重新加载进程。