LoongLee's blog

Gunicorn

Gunicorn

定义

Gunicorn (Green Unicorn) 是一个用于 Python 的 WSGI HTTP 服务器,广泛用于生产环境部署 Django、Flask 等 Web 应用。

核心特性

  • 预派生(pre-fork)模型:主进程管理多个工作进程
  • 多种工作模式:同步、异步、基于事件的多种工作类
  • 自动工作进程管理:按需重启工作进程
  • 信号处理:支持平滑重启和优雅关闭

工作原理

Master Process
├── Worker 1
├── Worker 2
├── Worker 3
└── Worker 4
  • 主进程(Master):管理工作进程,不处理请求
  • 工作进程(Worker):实际处理 HTTP 请求

配置示例

# gunicorn.conf.py
bind = "0.0.0.0:8000"
workers = 3  # (2 x CPU核心数) + 1
worker_class = "sync"
max_requests = 1000
max_requests_jitter = 50
timeout = 30
keepalive = 2

# 日志
accesslog = "-"  # stdout
errorlog = "-"   # stderr
loglevel = "info"

# 进程名称
proc_name = "myapp"

# 用户/组(生产环境)
user = "django"
group = "django"

常用命令

# 基本启动
gunicorn myproject.wsgi:application

# 指定配置
gunicorn -c gunicorn.conf.py myproject.wsgi:application

# 热重载(开发环境)
gunicorn --reload myproject.wsgi:application

# 指定绑定地址
gunicorn -b 0.0.0.0:8000 myproject.wsgi:application

工作模式

工作类 适用场景 特点
sync CPU 密集型 简单稳定,默认
gevent I/O 密集型 协程,高并发
eventlet I/O 密集型 协程,高并发
tornado Tornado 应用 异步非阻塞
gthread 线程池 每个 worker 多线程

与 Nginx 配合使用

upstream django_app {
    server 127.0.0.1:8000;
}

server {
    listen 80;
    location / {
        proxy_pass http://django_app;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
    location /static/ {
        alias /path/to/static/;
    }
}

生产环境最佳实践

  1. 工作进程数:(2 x CPU核心数) + 1
  2. 最大请求数:防止内存泄漏,定期重启 worker
  3. 超时设置:防止长时间运行的请求占用资源
  4. 日志记录:启用访问日志和错误日志
  5. 非 root 用户:以普通用户权限运行
  6. 配合反向代理:Nginx 处理静态文件和负载均衡

相关技术

  • WSGI - Web 服务器网关接口
  • Django - Web 框架
  • Docker - 容器化部署
  • Nginx - 反向代理服务器

录入自: Django开发实践笔记