Gunicorn
Gunicorn(Green Unicorn)是 Python WSGI HTTP 服务器,也是 Django/Flask 等 Web 应用在生产环境中最常用的“容器”。它基于 pre-fork 模型,能够很好地处理并发请求。 它的主要优势在于简单、轻量级、高性能,并且支持多种 Python Web 框架。
1. 安装 Gunicorn
Gunicorn 仅支持 Unix 系统(如 Linux, macOS),不支持 Windows 生产环境。
在你的项目虚拟环境(推荐) 中安装 Gunicorn。使用虚拟环境
pip install gunicorn如果你的项目涉及大量异步 I/O 操作(如长轮询、WebSocket),建议安装异步依赖:
pip install gunicorn[gevent]2.基础命令启动
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
# 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
# -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;)。
常用管理命令
# 停止服务: 找到 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),或者确保你的代码和依赖库是线程/协程安全的。