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

相关推荐
2501_944521593 小时前
Ramda 跨端三方库仓颉适配全流程
开发语言·javascript·flutter·php
行思理3 小时前
go语言学习难度及适合学习的人群
开发语言·学习·golang
wangchunyu1145 小时前
JAVA CompletableFuture异步编程实战
java·开发语言·python
程序 代码狂人6 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
2501_944521597 小时前
Immer 跨端三方库仓颉适配全流程
python·eclipse·django
信誓旦旦的程序猿7 小时前
【Python量化实战宝典 #26】止损与回撤控制手册:移动止损、最大回撤(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
2501_944521597 小时前
Deepmerge 跨端三方库仓颉适配全流程
java·python·eclipse·github
Patrick在香港7 小时前
同一行 strftime,两台机器跑出两种日期
python·datetime·时区·locale·日期处理
2601_967987377 小时前
用Python+OpenCV+YOLO写个游戏脚本:从自动瞄准到自动采集的保姆级教程
python·opencv·yolo·目标检测·游戏自动化
meiying88387 小时前
快递单号批量查询Python脚本:从手动到自动化的完整实现
开发语言·python·自动化