在这里插入图片描述

网罗开发 (小红书、快手、视频号同名)

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括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 数量:

uvicorn main:app --host 0.0.0.0 --port 8000 --workers 2

要点:

  • main:appmain 为模块名(文件名 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 处理请求:

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 即可:

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):

[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 使用即可。

Logo

加入「COC·上海城市开发者社区」,成就更好的自己!

更多推荐