Supervisor 完全指南:进程管理利器
在服务器运维和应用部署中,进程管理是一个非常重要的话题。如何确保应用程序持续运行?如何在程序崩溃时自动重启?如何管理多个进程?Supervisor 就是为解决这些问题而生的工具。本文将全面介绍 Supervisor 的使用方法,从基础到进阶,帮助你掌握这个强大的进程管理工具。
什么是 Supervisor?
Supervisor 是一个用 Python 编写的进程管理工具,它能够将一个普通的命令行进程变为后台守护进程,并监控该进程的运行状态,在进程退出时自动重启。它提供了丰富的配置选项和便捷的管理接口,是 Linux/Unix 系统下服务进程管理的首选工具之一。
Supervisor 的主要特性:
- 进程的启动、停止、重启
- 进程崩溃自动重启
- 进程组管理
- 日志管理
- Web 管理界面
- 权限管理
- 事件通知
安装 Supervisor
Supervisor 的安装非常简单,可以通过包管理器或 pip 进行安装。
使用包管理器安装
在 Ubuntu/Debian 系统:
sudo apt update
sudo apt install supervisor
在 CentOS/RHEL 系统:
sudo yum install epel-release
sudo yum install supervisor
使用 pip 安装
pip install supervisor
安装完成后,Supervisor 会创建以下重要文件和目录:
/etc/supervisor/supervisord.conf
:主配置文件/etc/supervisor/conf.d/
:程序配置文件目录/var/log/supervisor/
:日志文件目录
Supervisor 基本配置
主配置文件
Supervisor 的主配置文件通常位于 /etc/supervisor/supervisord.conf
,包含了 Supervisor 的全局设置。以下是一个基本的配置示例:
[unix_http_server]
file=/var/run/supervisor.sock
chmod=0700
[supervisord]
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid
childlogdir=/var/log/supervisor
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock
[include]
files = /etc/supervisor/conf.d/*.conf
程序配置文件
对于每个需要管理的程序,我们需要在 /etc/supervisor/conf.d/
目录下创建一个配置文件。例如,创建一个名为 myapp.conf
的配置文件:
[program:myapp]
command=/usr/bin/python /path/to/your/app.py
directory=/path/to/your/app
user=www-data
autostart=true
autorestart=true
stderr_logfile=/var/log/supervisor/myapp.err.log
stdout_logfile=/var/log/supervisor/myapp.out.log
environment=PATH="/usr/local/bin:/usr/bin:/bin"
Supervisor 常用命令
supervisorctl 基本操作
# 启动 supervisord
sudo supervisord
# 查看所有程序状态
sudo supervisorctl status
# 启动特定程序
sudo supervisorctl start myapp
# 停止特定程序
sudo supervisorctl stop myapp
# 重启特定程序
sudo supervisorctl restart myapp
# 重新加载配置文件
sudo supervisorctl reread
sudo supervisorctl update
# 进入交互式命令行
sudo supervisorctl
进阶配置
进程组管理
可以将多个相关的程序组织成一个组:
[group:mygroup]
programs=prog1,prog2,prog3
[program:prog1]
command=/path/to/prog1
...
[program:prog2]
command=/path/to/prog2
...
[program:prog3]
command=/path/to/prog3
...
环境变量配置
[program:myapp]
command=/path/to/app
environment=
PATH="/usr/local/bin:/usr/bin:/bin",
NODE_ENV="production",
DATABASE_URL="postgresql://user:pass@localhost/db"
事件监听器
[eventlistener:memmon]
command=memmon -p program_name=1GB
events=TICK_60
日志管理
Supervisor 提供了强大的日志管理功能:
[program:myapp]
stdout_logfile=/var/log/supervisor/myapp.out.log
stderr_logfile=/var/log/supervisor/myapp.err.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_capture_maxbytes=1MB
Web 管理界面配置
可以启用 Supervisor 的 Web 界面进行可视化管理:
[inet_http_server]
port=*:9001
username=admin
password=123456
最佳实践
- 合理设置重启策略
[program:myapp]
startretries=3
startsecs=10
stopwaitsecs=10
- 使用优先级控制启动顺序
[program:database]
priority=100
[program:webapp]
priority=200
- 设置资源限制
[program:myapp]
user=nobody
umask=022
常见问题排查
- 进程无法启动
- 检查命令路径是否正确
- 检查用户权限
- 查看错误日志
- 自动重启不生效
- 确认
autorestart
配置 - 检查
exitcodes
设置
- 日志文件权限问题
- 确保日志目录存在
- 检查目录权限
总结
Supervisor 是一个功能强大且易用的进程管理工具,它能够帮助我们:
- 将普通进程转化为守护进程
- 实现进程的自动重启
- 提供便捷的进程管理接口
- 处理日志记录
- 支持进程组管理
通过合理配置和使用 Supervisor,我们可以大大简化服务器进程的管理工作,提高系统的可靠性和可维护性。