Supervisor 教程
Supervisor 教程 详解
Supervisor 是一个用 Python 编写的进程管理工具,常用于类 UNIX 操作系统下管理和监控进程,特别适合管理守护进程、长期运行的服务(如 web 应用、后台任务等)。它能够自动重启异常退出的进程,并提供强大的日志管理和 Web UI 界面,方便开发者监控和控制进程。
本文将深入介绍如何使用 Supervisor 管理进程,覆盖从安装、配置到高级功能及实践的各个方面。
目录
- Supervisor 简介
- Supervisor 安装
- Supervisor 配置文件详解
- Supervisor 常用命令
- Supervisor 实战案例
- Supervisor 高级功能
- Supervisor Web 界面
- 日志管理
- 常见问题与解决方案
- 总结
1. Supervisor 简介
Supervisor 的主要功能是管理进程,使得进程能够在后台运行、重启,并具备监控功能。它特别适合以下场景:
- 守护进程:例如 Web 服务器、后台任务队列。
- 服务监控:自动重启由于崩溃或退出而停止的服务。
- 日志管理:集中管理所有子进程的日志。
核心功能:
- 自动重启进程:当进程崩溃或非正常退出时,Supervisor 会自动重启该进程。
- 日志管理:可以记录进程的标准输出和标准错误日志,方便调试和监控。
- 进程组管理:支持将多个进程归类管理,方便批量操作。
- Web 界面:通过简单的 Web 界面监控和控制进程状态。
2. Supervisor 安装
2.1 安装 Supervisor
在 CentOS、Ubuntu 或其他基于 Linux 的系统中,可以通过包管理器或 pip
安装 Supervisor。
使用 yum
安装(CentOS)
sudo yum install epel-release
sudo yum install supervisor
使用 apt
安装(Ubuntu)
sudo apt-get update
sudo apt-get install supervisor
使用 pip
安装(适用于任何 Python 环境)
pip install supervisor
2.2 启动 Supervisor
安装完成后,通过以下命令启动 Supervisor 守护进程:
sudo systemctl start supervisord
sudo systemctl enable supervisord
默认配置文件路径为 /etc/supervisord.conf
,其中包含 Supervisor 的主要配置。
3. Supervisor 配置文件详解
Supervisor 的配置文件采用 .ini
格式,每个部分定义不同的功能和参数。
3.1 生成默认配置文件
如果需要自定义配置文件,可以通过以下命令生成默认配置:
echo_supervisord_conf > /etc/supervisord.conf
3.2 配置文件结构
配置文件主要由以下几个部分组成:
[unix_http_server]
用于定义 Supervisor 与 supervisorctl
或 Web 界面之间的通信方式,通常通过 Unix socket 连接。
[unix_http_server]
file=/var/run/supervisor.sock ; 定义 socket 文件路径
chmod=0700 ; 权限设置
[inet_http_server]
定义 HTTP 服务器配置,用于启用 Web 界面。
[inet_http_server]
port=127.0.0.1:9001 ; 定义监听的 IP 和端口
username=user ; Web 界面登录用户名
password=pass ; Web 界面登录密码
[supervisord]
用于定义 Supervisor 主进程的配置,如日志、pid 文件等。
[supervisord]
logfile=/var/log/supervisord.log ; 主日志文件路径
pidfile=/var/run/supervisord.pid ; 守护进程的 pid 文件
childlogdir=/var/log/supervisor/ ; 子进程的日志目录
[program:x]
每个需要管理的进程都通过 [program:x]
定义。可以管理多个子进程。
[program:myapp]
command=/path/to/your/program ; 启动命令
autostart=true ; Supervisor 启动时是否自动启动
autorestart=true ; 如果进程崩溃是否自动重启
stderr_logfile=/var/log/myapp.err.log ; 错误日志路径
stdout_logfile=/var/log/myapp.out.log ; 输出日志路径
4. Supervisor 常用命令
Supervisor 提供了命令行工具 supervisorctl
,用于管理和监控进程。常见命令如下:
4.1 查看进程状态
查看所有由 Supervisor 管理的进程状态:
supervisorctl status
4.2 启动进程
启动某个由 Supervisor 管理的进程:
supervisorctl start myapp
4.3 停止进程
停止某个进程:
supervisorctl stop myapp
4.4 重启进程
重启某个进程:
supervisorctl restart myapp
4.5 重新读取配置文件
当修改了 Supervisor 的配置文件后,使用以下命令重新读取配置:
supervisorctl reread
supervisorctl update
5. Supervisor 实战案例
案例:使用 Supervisor 管理 Gunicorn
假设我们有一个 Django 项目,并使用 Gunicorn 作为 WSGI 服务器,可以通过 Supervisor 管理 Gunicorn 进程。
5.1 配置 Gunicorn 的 Supervisor 配置
在 /etc/supervisord.d/gunicorn.conf
文件中添加以下内容:
[program:gunicorn]
command=/path/to/venv/bin/gunicorn myproject.wsgi:application --bind 127.0.0.1:8000
directory=/path/to/myproject
autostart=true
autorestart=true
stderr_logfile=/var/log/gunicorn.err.log
stdout_logfile=/var/log/gunicorn.out.log
user=www-data
5.2 启动 Supervisor 管理 Gunicorn
启动 Supervisor 并让其管理 Gunicorn:
supervisorctl reread
supervisorctl update
supervisorctl start gunicorn
Gunicorn 将由 Supervisor 启动和管理,任何崩溃或异常都会触发自动重启。
6. Supervisor 高级功能
6.1 进程组管理
Supervisor 允许你将多个进程归类为一组,便于对整组进程进行统一操作。
在配置文件中定义一个进程组:
[group:mygroup]
programs=myapp1,myapp2
你可以使用以下命令来控制整个组:
supervisorctl start mygroup:*
supervisorctl stop mygroup:*
6.2 环境变量
通过 environment
参数可以为某个进程定义自定义的环境变量。
[program:myapp]
command=/path/to/myapp
environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8
7. Supervisor Web 界面
Supervisor 提供了一个简洁的 Web 界面,便于通过浏览器监控和控制进程。
7.1 启用 Web 界面
在配置文件中启用 Web 界面:
[inet_http_server]
port=127.0.0.1:9001 ; 定义监听的 IP 和端口
username=admin ; 登录用户名
password=admin ; 登录密码
重启 Supervisor:
sudo supervisorctl reread
sudo supervisorctl update
然后,访问 http://127.0.0.1:9001
,输入配置的用户名和密码,即可查看和管理进程。
8. 日志管理
Supervisor 可以对进程的标准输出和标准错误进行日志记录,并提供日志轮转功能。
8.1 设置日志路径
在每个进程的配置中,通过 stdout_logfile
和 stderr_logfile
来指定日志路径:
[program:myapp]
stdout_logfile=/var/log/myapp.out.log
stderr_logfile=/var/log/myapp.err.log
8.2 日志轮转
Supervisor 支持日志轮转(log rotation),可以通过以下参数设置:
stdout_logfile_maxbytes=50MB ; 单个日志文件的最大大小
stdout_logfile_backups=10 ; 保留的旧日志文件数量
9. 常见问题与解决方案
9.1 权限问题
如果你的进程需要以非 root 用户身份运行,请确保在配置文件中设置正确的 user
参数,并保证该用户有权限访问相关文件和目录。
9.2 配置文件修改后不生效
当你修改了 Supervisor 的配置文件后,需要使用以下命令重新加载配置:
supervisorctl reread
supervisorctl update
10. 总结
Supervisor 是一个功能强大的进程管理工具,尤其适合管理长期运行的 Python 应用程序。通过 Supervisor,开发者可以方便地管理后台服务、记录日志、重启进程并通过 Web 界面监控系统。