Skip to content

Gunicorn

Gunicorn(Green Unicorn)是 Python WSGI HTTP 服务器,也是 Django/Flask 等 Web 应用在生产环境中最常用的“容器”。它基于 pre-fork 模型,能够很好地处理并发请求。 它的主要优势在于简单、轻量级、高性能,并且支持多种 Python Web 框架。

1. 安装 Gunicorn

Gunicorn 仅支持 Unix 系统(如 Linux, macOS),不支持 Windows 生产环境。

在你的项目虚拟环境(推荐) 中安装 Gunicorn。使用虚拟环境

bash
pip install gunicorn

如果你的项目涉及大量异步 I/O 操作(如长轮询、WebSocket),建议安装异步依赖:

bash
pip install gunicorn[gevent]

2.基础命令启动

bash
gunicorn --workers=4 --bind=0.0.0.0:8000 myproject.wsgi:application
常用参数说明默认值
-w 或 --workers工作进程数(2 * CPU核心数) + 1 (例如 4)
-b 或 --bind绑定的地址和端口0.0.0.0:8000 (0.0.0.0允许外部访问)
-k 或 --worker-class工作进程类型sync (默认), gevent (异步)
--timeout进程超时时间(秒)30 或 60 (防止进程卡死)
--log-level日志级别info, debug, error
--access-logfile访问日志文件- (输出到控制台) 或 access.log

3. 使用配置文件 (推荐)

在生产环境中,命令行参数会很长且容易出错,因此建议使用配置文件。

3.1 创建配置文件

在 Django 项目根目录(与 manage.py 同级)创建 gunicorn.conf.py

python
# gunicorn.conf.py
import multiprocessing
# 绑定的ip与端口
bind = "0.0.0.0:8000"
# 最大挂起连接数(队列)
backlog = 512
# 进程数
# workers = 4  # 固定值
workers = multiprocessing.cpu_count() * 2 + 1  # 动态根据CPU核心数计算
# 进程名称
proc_name = 'gunicorn_django'
# 工作模式(同步或异步)
worker_class = 'sync'  # 或 'gevent'
# 超时时间
timeout = 30
# 后台运行 (守护进程)
# daemon = True  # 生产环境可开启,调试时建议注释掉以便看日志
# 日志设置
log_level = 'info'
# 访问日志
accesslog = "./logs/gunicorn_access.log"
# 错误日志
errorlog = "./logs/gunicorn_error.log"

3.2 使用配置文件启动 Gunicorn

bash
# -c 指定配置文件,最后的 myproject.wsgi:application 是 Django 的 WSGI 入口
gunicorn -c gunicorn.conf.py myproject.wsgi:application

实际部署

  • 收集静态文件: 在启动 Gunicorn 前,务必先运行 python manage.py collectstatic,因为 Gunicorn 本身不处理静态文件(通常由 Nginx 处理)。

  • 迁移数据库: 确保 python manage.py migrate 已执行。

  • 配合 Nginx (生产标准): Gunicorn 通常不直接对外提供服务,而是放在 Nginx 后面。Nginx 处理静态文件和 SSL,然后将动态请求转发给 Gunicorn(通过 proxy_pass http://127.0.0.1:8000;)。

常用管理命令

bash
# 停止服务: 找到 Gunicorn 主进程的 PID(通常在日志或通过 ps aux | grep gunicorn 查看),然后执行
kill -TERM <主进程PID>
# 平滑重启 (不中断现有连接):
kill -HUP <主进程PID>
# 查看运行状态
ps aux | grep gunicorn

注意事项⚠️

  • 不要在 Windows 上生产使用: Gunicorn 依赖 Unix 的 fork 机制。

  • 安全: 不要直接使用 Gunicorn 处理用户上传的大文件或直接暴露在公网,建议前面加 Nginx 做反向代理和缓冲。

  • 异步支持: 如果使用 gevent 模式,可能需要对 Python 标准库进行“猴子补丁”(Monkey Patch),或者确保你的代码和依赖库是线程/协程安全的。