
网罗开发 (小红书、快手、视频号同名)
大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。
图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG
我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验 。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。
展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索"展菲",即可纵览我在各大平台的知识足迹。
📣 公众号"Swift社区",每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友"fzhanfei",与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 3 月 17 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!
文章目录
前言
Python Web 应用(Flask、FastAPI 等)开发时常用内置服务器(如 Flask 的 run、FastAPI 的 uvicorn main:app),但这类服务器是单进程、未针对并发与稳定性优化,不适合直接用于生产。生产环境通常用 Gunicorn(WSGI)或 Uvicorn(ASGI)作为进程管理器,配合 worker 数量、超时、重启等配置,在 Nginx 反向代理后对外服务。
本文只讲 Gunicorn、Uvicorn 的核心用法和关键参数,不贴完整可运行 Demo。
WSGI 与 ASGI 区别
- WSGI:同步模型,适合 Flask、Django 等传统框架;Gunicorn 是常用 WSGI 服务器。
- ASGI:支持异步,适合 FastAPI、Starlette;Uvicorn 是 ASGI 服务器,也可通过 Gunicorn + Uvicorn worker 运行 FastAPI。
若项目是 FastAPI,可直接用 Uvicorn 或多 worker;若希望用 Gunicorn 管理进程,则用 Gunicorn 配 Uvicorn worker 来跑 FastAPI。
使用 Uvicorn 直接运行 FastAPI
最简单的方式是直接用 Uvicorn 启动,指定 worker 数量:
bash
uvicorn main:app --host 0.0.0.0 --port 8000 --workers 2
要点:
- main:app :
main为模块名(文件名 main.py),app为 FastAPI 实例变量名。 - --host 0.0.0.0:监听所有网卡,便于容器或 Nginx 访问;仅本机访问可用 127.0.0.1。
- --workers 2:进程数,建议与 CPU 核数相当或略多,过多会增加内存和上下文切换。
- --timeout-keep-alive:保持连接超时,默认 5;长连接场景可适当增大。
生产环境通常还会配合 Nginx 反向代理,Uvicorn 只监听本机 8000,不直接对外。
使用 Gunicorn + Uvicorn Worker 运行 FastAPI
Gunicorn 负责多进程管理、优雅重启等,Uvicorn 作为 worker 处理请求:
bash
gunicorn main:app -w 2 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000
要点:
- main:app:同上,FastAPI 应用所在模块与变量名。
- -w 2:worker 数量,相当于 2 个 Uvicorn 进程。
- -k uvicorn.workers.UvicornWorker:指定使用 Uvicorn 作为 worker 类,否则 Gunicorn 默认按 WSGI 跑,无法正确运行 FastAPI。
- -b 0.0.0.0:8000:绑定地址与端口。
常用可选参数:
- --timeout 60:worker 处理单次请求的超时时间(秒),超时后 Gunicorn 会重启该 worker。
- --graceful-timeout 30:优雅关闭时等待 worker 结束的最长时间。
- --access-logfile /path/to/access.log:访问日志路径;不写则打到 stderr。
- --error-logfile /path/to/error.log:错误日志路径。
使用 Gunicorn 运行 Flask(WSGI)
Flask 是 WSGI 应用,直接用 Gunicorn 即可:
bash
gunicorn "app:create_app()" -w 2 -b 0.0.0.0:8000
若应用工厂是 create_app(),传入可调用对象;若直接是 app = Flask(__name__),则写 app:app。-w、-b、--timeout 等与上面类似。
Worker 数量与资源
- CPU 密集:worker 数约等于 CPU 核数,避免过多上下文切换。
- IO 密集 :可略多于核数,如
2 * cpu_count + 1,具体看内存与压测结果。 - 每个 worker 会占用一定内存,总内存 ≈ worker 数 × 单进程内存,需保证服务器内存足够。
进程管理与开机自启
生产环境不用手敲命令,通常用 systemd 或 Supervisor 管理 Gunicorn/Uvicorn 进程:
systemd 示例(/etc/systemd/system/myapp.service):
ini
[Unit]
Description=My Python Web App
After=network.target mysql.service
[Service]
Type=notify
User=deploy
Group=deploy
WorkingDirectory=/var/www/app/backend
Environment="PATH=/var/www/app/venv/bin"
ExecStart=/var/www/app/venv/bin/gunicorn main:app -w 2 -k uvicorn.workers.UvicornWorker -b 127.0.0.1:8000
ExecReload=/bin/kill -s HUP $MAINPID
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
启用:sudo systemctl enable myapp && sudo systemctl start myapp。Nginx 反向代理到 127.0.0.1:8000 即可。
总结
- FastAPI:生产用 Uvicorn 多 worker,或 Gunicorn + UvicornWorker;Flask 用 Gunicorn 即可。
- 关键参数:worker 数、绑定地址、超时、日志路径;部署时只监听本机,由 Nginx 对外。
- 用 systemd/Supervisor 做进程管理与开机自启,便于运维与重启。
这样即可稳定、可控地部署 Python 后端,配合 Nginx 与 Docker 使用即可。