使用 Supervisor 管理 Gunicorn 实现高可用 Python Web 应用

时间:2025-02-27 08:31:59

前言

在生产环境中,部署 Python Web 应用时,我们通常使用 Gunicorn(Green Unicorn)作为 WSGI 服务器。为了确保应用能够稳定运行,能够在崩溃后自动重启,Supervisor 是一个常用的进程管理工具,它可以很好地与 Gunicorn 配合使用,实现进程监控、自动重启等功能。

本文将详细介绍如何使用 Supervisor 来管理 Gunicorn,确保 Python Web 应用在生产环境中的高可用性。


目录

  • 前言
      • 1. 安装 Supervisor 和 Gunicorn
        • 安装 Gunicorn
        • 安装 Supervisor
      • 2. 配置 Gunicorn 启动命令
      • 3. 配置 Supervisor 管理 Gunicorn 进程
        • 创建 Gunicorn 配置文件
      • 4. 启动 Supervisor 管理 Gunicorn
      • 5. 检查 Gunicorn 服务状态
      • 6. 重启和停止 Gunicorn 服务
      • 7. 配置 Supervisor 开机自启
        • 使用 systemd(适用于 Ubuntu 16 及以上版本)
        • 使用 init.d(适用于较老的 Linux 系统)
      • 8. 使用 Gunicorn 的平滑重启功能
      • 9. 日志管理
      • 10. 总结

1. 安装 Supervisor 和 Gunicorn

在开始之前,我们需要安装 SupervisorGunicorn

安装 Gunicorn
pip install gunicorn
安装 Supervisor

在 Ubuntu/Debian 系统中,我们可以通过 apt 安装 Supervisor

sudo apt update
sudo apt install supervisor

在 CentOS/RHEL 系统中,可以通过 yum 安装:

sudo yum install supervisor

2. 配置 Gunicorn 启动命令

假设你的 Python Web 应用使用 Flask 或 Django 框架,Gunicorn 可以通过命令行启动。例如:

gunicorn --workers 3 myapp:app

在这个命令中:

  • --workers 3:指定启动 3 个 worker 进程来处理请求,提高并发能力。
  • myapp:appmyapp 是你的 Python 文件名,app 是 Flask 或 Django 中的应用对象。

3. 配置 Supervisor 管理 Gunicorn 进程

为了让 Supervisor 管理 Gunicorn 进程,我们需要创建一个配置文件。Supervisor 的配置文件通常放在 /etc/supervisor/conf.d/ 目录下。

创建 Gunicorn 配置文件

/etc/supervisor/conf.d/ 目录下创建一个名为 myapp.conf 的文件:

[program:myapp]
command=gunicorn --workers 3 myapp:app
directory=/path/to/your/app
autostart=true
autorestart=true
stderr_logfile=/var/log/myapp.err.log
stdout_logfile=/var/log/myapp.out.log
user=yourusername
group=yourgroup
environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8
  • command:启动 Gunicorn 的命令,指定了使用 3 个 worker 进程来处理请求。
  • directory:你的 Flask 或 Django 应用所在的目录。
  • autostart=trueSupervisor 启动时会自动启动 Gunicorn
  • autorestart=true:如果 Gunicorn 进程崩溃,Supervisor 会自动重启它。
  • stderr_logfilestdout_logfile:指定标准错误和标准输出的日志文件路径,便于后续查看日志。
  • usergroup:指定运行进程的用户和用户组,确保进程以正确的权限运行。
  • environment:设置应用运行时的环境变量。

4. 启动 Supervisor 管理 Gunicorn

配置文件创建完成后,需要更新 Supervisor 配置并启动进程。执行以下命令:

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start myapp
  • reread:重新读取配置文件,加载新的配置。
  • update:更新进程列表,确保新配置生效。
  • start myapp:启动名为 myapp 的 Gunicorn 服务。

5. 检查 Gunicorn 服务状态

使用以下命令查看 Supervisor 管理的所有进程的状态:

sudo supervisorctl status

输出示例:

myapp                           RUNNING   pid 12345, uptime 1:23:45

这里,RUNNING 表示 Gunicorn 正在运行,pid 是进程 ID,uptime 是进程启动以来的运行时间。

6. 重启和停止 Gunicorn 服务

在应用更新或配置变更后,你可能需要重启 Gunicorn 服务。可以通过 Supervisor 执行重启操作:

sudo supervisorctl restart myapp

如果需要停止 Gunicorn 服务:

sudo supervisorctl stop myapp

7. 配置 Supervisor 开机自启

确保 Supervisor 服务在系统启动时自动启动。你可以使用以下命令在开机时启用 Supervisor

使用 systemd(适用于 Ubuntu 16 及以上版本)
sudo systemctl enable supervisor
sudo systemctl start supervisor
使用 init.d(适用于较老的 Linux 系统)
sudo update-rc.d supervisor defaults

这样,Supervisor 就会在系统启动时自动启动,进而启动 Gunicorn 进程。

8. 使用 Gunicorn 的平滑重启功能

Gunicorn 支持平滑重启(即无中断地重启 worker 进程),通常用于零停机的更新。如果你使用的是 Gunicorn 的 master-worker 模式,可以通过以下命令实现平滑重启:

gunicorn --workers 3 --bind 0.0.0.0:8000 --reload myapp:app

然而,Supervisor 本身并不直接支持平滑重启,因此,在生产环境中通常还是选择使用 restart 命令来重启服务。

9. 日志管理

Supervisor 配置中已经指定了标准输出和标准错误日志的路径(stderr_logfilestdout_logfile)。你可以通过以下命令查看日志:

tail -f /var/log/myapp.out.log
tail -f /var/log/myapp.err.log

这对于排查应用错误和调试非常有帮助。

10. 总结

通过结合使用 SupervisorGunicorn,你可以轻松管理 Python Web 应用的进程,确保应用在崩溃时能够自动重启,提高服务的稳定性和可用性。Supervisor 不仅可以监控进程,还能提供日志管理和开机自启等功能,使得部署和运维变得更加高效。

相关文章