Gunicorn 与 Uvicorn 部署 Python 后端详解


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

大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验 。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员

👋 大家好,我是展菲!

📱 全网搜索"展菲",即可纵览我在各大平台的知识足迹。

📣 公众号"Swift社区",每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。

💬 微信端添加好友"fzhanfei",与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。

📅 最新动态:2025 年 3 月 17 日

快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!

文章目录

    • 前言
    • [WSGI 与 ASGI 区别](#WSGI 与 ASGI 区别)
    • [使用 Uvicorn 直接运行 FastAPI](#使用 Uvicorn 直接运行 FastAPI)
    • [使用 Gunicorn + Uvicorn Worker 运行 FastAPI](#使用 Gunicorn + Uvicorn Worker 运行 FastAPI)
    • [使用 Gunicorn 运行 Flask(WSGI)](#使用 Gunicorn 运行 Flask(WSGI))
    • [Worker 数量与资源](#Worker 数量与资源)
    • 进程管理与开机自启
    • 总结

前言

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: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 处理请求:

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

相关推荐
Coinsheep16 小时前
SSTI-flask靶场搭建及通关
python·flask·ssti
IT实战课堂小元酱16 小时前
大数据深度学习|计算机毕设项目|计算机毕设答辩|flask露天矿爆破效果分析系统开发及应用
人工智能·python·flask
码农阿豪16 小时前
Flask应用上下文问题解析与解决方案:从错误日志到完美修复
后端·python·flask
wqq631085516 小时前
Python基于Vue的实验室管理系统 django flask pycharm
vue.js·python·django
Q_Q196328847516 小时前
python大学生爱心校园互助代购网站_nyvlx_django Flask vue pycharm项目
python·django·flask
码农阿豪16 小时前
Python Flask应用中文件处理与异常处理的实践指南
开发语言·python·flask
岁岁种桃花儿16 小时前
CentOS7 彻底卸载所有JDK/JRE + 重新安装JDK8(实操完整版,解决kafka/jps报错)
java·开发语言·kafka
xcLeigh16 小时前
Python 项目实战:用 Flask 实现 MySQL 数据库增删改查 API
数据库·python·mysql·flask·教程·python3
威迪斯特16 小时前
Flask:轻量级Web框架的技术本质与工程实践
前端·数据库·后端·python·flask·开发框架·核心架构