gunicorn

Gunicorn:提供了更大的灵活性,你可以通过命令行参数、环境变量或一个 Python 配置文件(.py)来配置它

为什么需要配置 Gunicorn?

默认的 Gunicorn 设置可能不适合你的生产环境。通过配置,你可以优化性能、资源使用和稳定性,例如:

  • 设置正确的工作进程/线程数量
  • 调整监听地址和端口,以便与 Nginx 通信
  • 配置日志格式和输出位置,便于故障排除
  • 设置进程名称,方便用 tophtop等工具监控
  • 实现优雅重启(不中断服务的情况下重新加载代码)

Gunicorn 的三种配置方法

1、命令行参数(最简单)

直接在启动命令中指定所有选项。适用于简单场景或临时测试

缺点:命令会变得很长,难以管理和维护,也容易出错

2、环境变量

可以通过设置环境变量来配置某些参数,但这种方式不常用作主要配置方法

3、 配置文件(推荐用于生产环境)

这是最专业、最可维护的方式。你可以创建一个 Python 文件(例如 gunicorn_conf.py)来存储所有配置

优点

  • 版本控制:可以像管理代码一样用 Git 管理配置变更
  • 可读性强:配置结构清晰,有注释
  • 易于管理:与启动命令分离,修改配置无需修改启动脚本

强烈推荐(使用配置文件)

如何创建并使用 Gunicorn 配置文件

步骤 1:创建配置文件

在你的项目目录(或 /etc/ 下)创建一个文件,例如 gunicorn_conf.py

# gunicorn_conf.py
import multiprocessing

# 服务器套接字
bind = "127.0.0.1:8000"  # 只监听本地请求,让Nginx来代理

# 工作进程数
# 经典公式: (2 * num_cores) + 1
# 先使用这个公式,再根据实际负载进行调整
workers = multiprocessing.cpu_count() * 2 + 1

# 每个工作进程的线程数
# 对于I/O密集型应用(如Django),使用线程可能有益
threads = 2

# 工作模式(通常不需要修改,除非你用到了异步)
worker_class = 'sync'

# 最大并发客户端数(每个工作进程)
worker_connections = 1000

# 最大请求数:工作进程处理这么多请求后会自动重启,防止内存泄漏
max_requests = 1000
max_requests_jitter = 50  # 添加随机抖动,避免所有工作进程同时重启

# 超时设置:如果一个工作进程在这么多秒内没有响应,它将被重启
timeout = 30

# 优雅超时:接到重启信号后,等待当前请求完成的最长时间
graceful_timeout = 30

# 日志配置
# 访问日志文件
accesslog = "/var/log/gunicorn/access.log"
# 错误日志文件
errorlog = "/var/log/gunicorn/error.log"
# 日志级别
loglevel = "info"

# 进程名称(方便用ps, top等工具查看)
proc_name = "my_django_app_gunicorn"

# 在fork工作进程之前加载应用,可以节省内存,但可能会带来兼容性问题
preload_app = True

步骤 2:使用配置文件启动 Gunicorn

使用 -c 参数指定配置文件路径

gunicorn -c /path/to/your/gunicorn_conf.py myproject.wsgi:application

生产环境中的标准实践:搭配 Systemd

在生产环境中,你通常不会手动在终端启动 Gunicorn。而是使用 Systemd 来将其作为一个服务管理(开机自启、自动重启、集中日志等)

创建一个 Systemd 服务文件/etc/systemd/system/gunicorn.service

[Unit]
Description=gunicorn daemon for my Django project
After=network.target

[Service]
User=www-data  # 运行此服务的用户,按你的实际情况修改
Group=www-data # 用户组
WorkingDirectory=/path/to/your/project  # 你的Django项目根目录
Environment="PATH=/path/to/your/venv/bin" # 虚拟环境的路径
ExecStart=/path/to/your/venv/bin/gunicorn -c /path/to/your/gunicorn_conf.py myproject.wsgi:application

[Install]
WantedBy=multi-user.target

然后就可以用 systemctl 来管理了:

sudo systemctl daemon-reload
sudo systemctl start gunicorn
sudo systemctl enable gunicorn # 设置开机自启
sudo systemctl status gunicorn # 查看状态