简介说明
Gunicorn(Green Unicorn)是一个用 Python 编写的 WSGI HTTP 服务器,专为 Unix 系统设计,广泛用于部署 Python Web 应用程序,特别是 Django、Flask、FastAPI 等框架。
主要特点
高性能:采用预分叉工作模型,支持多进程并发处理请求
易于配置:提供丰富的配置选项,支持配置文件和命令行参数
多种工作模式:支持同步和异步工作模式(sync、async、gevent、eventlet 等)
自动工作进程管理:自动重启崩溃的工作进程,确保服务稳定性
优雅重启:支持零停机时间的配置更新和代码部署
资源监控:内置工作进程资源监控,防止内存泄漏
信号处理:支持标准 Unix 信号进行进程管理
日志管理:灵活的日志配置,支持访问日志和错误日志
负载均衡:内置负载均衡,可与 Nginx 等反向代理配合使用
适用场景
Django、Flask、FastAPI 等 Python Web 应用部署
微服务架构中的 API 服务
高并发 Web 应用服务
需要稳定性和性能的生产环境
容器化部署(Docker、Kubernetes)
与 Nginx、Apache 等反向代理配合的后端服务
安装卸载
# 安装
# 示例:Python 项目中所使用的 conda 虚拟环境为 my_item_py310,将 Gunicorn 也装在相同的虚拟环境下
conda activate my_item_py310
pip install gunicorn
# 验证安装
gunicorn --version
# 查看帮助信息
gunicorn --help
# 卸载
# 示例:在 conda 虚拟环境中直接卸载
conda activate my_item_py310
pip uninstall gunicorn
# 验证卸载
gunicorn --version
# 应该提示命令未找到
启动服务
# 使用命令行参数启动
gunicorn App_Http_Server:app --workers 1 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:12321 --timeout 300 --worker-connections 1000 --max-requests 1000 --max-requests-jitter 100 --preload
# 基础参数
# App_Http_Server:app : 需要启动的服务
# - App_Http_Server: 待启动的 FastAPI 服务文件(不用带 .py 后缀)
# - app: FastAPI 服务文件中的应用实例对象名称
# --bind 0.0.0.0:12321: 绑定地址和端口
# - 0.0.0.0: 监听所有网络接口
# - 12321: 服务端口号
# 工作进程参数
# --workers 1: 启动 1 个并发服务
# - 一般设置为 2*CPU核心数+1
# - 对于 GPU 型 AI 应用,由于 AI 模型会占用大量 GPU 显存
# - k 个 worker 会导致 AI 模型加载 k 次,可能会超出显存限制
# - 因此设置单个 worker,配合异步处理也足够处理并发请求
# --worker-class uvicorn.workers.UvicornWorker: 指定工作进程类型
# sync: 同步工作进程(默认)
# gevent: 基于 gevent 的异步工作进程
# eventlet: 基于 eventlet 的异步工作进程
# tornado: 基于 tornado 的异步工作进程
# gthread: 基于线程的同步工作进程
# uvicorn.workers.UvicornWorker: ASGI 异步工作进程
# --threads 10: 每个工作进程的线程数(仅适用于--worker-class gthread)
# --worker-connections 1000: 单 worker 最大并发连接数
# - 默认 1000,适用于异步工作进程
# 性能和资源参数
# --timeout 300: 超时限制
# - 默认 30 秒,这里改为 300 秒,因为 TTS 生成、AI 推理等可能需要较长时间
# --max-requests 1000: 单 worker 处理请求数上限
# - 达到这个数量后,worker 会重启(防止内存泄漏)
# - 默认无限制,建议设置以防止内存泄漏
# --max-requests-jitter 100: 重启抖动范围
# - 在 900-1100 之间随机重启,避免所有 worker 同时重启
# --preload: 预加载应用
# - 在 fork worker 之前加载应用代码,可以节省内存
# - 但可能影响热重载功能
评论区