在服务器运维领域,确保应用程序持续稳定运行是核心任务之一,对于部署在 CentOS 7.2 这类稳定且广泛使用的服务器操作系统上的服务,一个强大的进程管理工具至关重要,Supervisor 正是这样一款基于 Python 开发的客户端/服务器系统,它允许用户监控和控制类 UNIX 操作系统上的多个进程,本文将详细介绍如何在 CentOS 7.2 环境下安装、配置和使用 Supervisor,以实现对应用程序的高效管理。

Supervisor 的安装与初始化
Supervisor 并未包含在 CentOS 7.2 的默认基础仓库中,因此我们需要先启用 EPEL (Extra Packages for Enterprise Linux) 仓库。
通过 yum 命令安装 EPEL 仓库:
sudo yum install epel-release -y
安装完成后,就可以直接安装 Supervisor 了:
sudo yum install supervisor -y
安装过程会自动处理所有依赖,安装完毕后,需要将 Supervisor 服务设置为开机自启,并立即启动它:
sudo systemctl start supervisord sudo systemctl enable supervisord
为了验证 Supervisor 是否成功运行,可以检查其状态:
sudo systemctl status supervisord
如果看到输出中包含 active (running) 字样,则表示 Supervisor 服务已正常启动,Supervisor 的主进程已经在后台运行,等待管理我们配置的应用程序。
Supervisor 的核心配置
Supervisor 的主要配置文件位于 /etc/supervisord.conf,这个文件定义了 Supervisor 自身的行为,例如服务端口、日志路径等,对于大多数场景,我们不需要过多修改此文件,其关键部分在于 [include] 片段,默认配置如下:
[include] files = supervisord.d/*.ini
这行配置指示 Supervisor 除了加载主配置文件外,还会自动加载 /etc/supervisord.d/ 目录下所有以 .ini 结尾的配置文件,这是一种极佳的实践,它让我们可以为每一个需要管理的应用程序创建独立的配置文件,实现了配置的模块化和清晰管理。

创建应用程序配置
假设我们有一个简单的 Python Web 应用,我们希望用 Supervisor 来管理它,我们可以在 /etc/supervisord.d/ 目录下创建一个名为 my_web_app.ini 的配置文件。
sudo vi /etc/supervisord.d/my_web_app.ini
可以如下所示:
[program:my_web_app] command=python3 /var/www/my_app/app.py directory=/var/www/my_app user=nginx autostart=true autorestart=true redirect_stderr=true stdout_logfile=/var/log/supervisor/my_web_app.log
这个配置文件定义了一个名为 my_web_app 的程序,下表解释了其中常用指令的含义:
| 指令 | 含义 |
|---|---|
[program:my_web_app] | 定义一个程序,my_web_app 是其唯一标识符。 |
command | 启动进程的命令,必须是能在前台持续运行的命令。 |
directory | 进程启动前切换到的目录。 |
user | 以哪个用户身份运行该进程。 |
autostart=true | 在 Supervisor 启动时,是否自动启动此程序。 |
autorestart=true | 当程序意外退出时,是否自动重启。 |
redirect_stderr=true | 是否将标准错误输出重定向到标准输出。 |
stdout_logfile | 标准输出日志文件的路径。 |
使用 supervisorctl 管理进程
配置文件创建或修改后,并不会立即生效,我们需要使用 supervisorctl 这个命令行客户端工具来通知 Supervisor 重新加载配置并应用更改。
让 Supervisor 读取新的或变更过的配置文件:
sudo supervisorctl reread
应用这些更改,这会启动新增的程序或重启配置发生变更的程序:
sudo supervisorctl update
我们可以使用 supervisorctl 来管理我们的进程了,以下是一些常用命令:
- 查看所有进程状态:
sudo supervisorctl status
- 启动指定进程:
sudo supervisorctl start my_web_app
- 停止指定进程:
sudo supervisorctl stop my_web_app
- 重启指定进程:
sudo supervisorctl restart my_web_app
supervisorctl 还提供了一个交互式 shell,直接输入 sudo supervisorctl 并回车即可进入,在其中可以直接输入 status, stop, start 等命令进行管理,无需每次都加 sudo。

启用 Web 管理界面
除了命令行,Supervisor 还提供了一个简洁的 Web 界面,方便进行可视化操作,要启用它,需要修改主配置文件 /etc/supervisord.conf,找到并取消注释 [inet_http_server] 部分,并进行如下配置:
[inet_http_server] port=127.0.0.1:9001 username=admin password=your_secure_password
修改保存后,重启 Supervisor 服务使配置生效:
sudo systemctl restart supervisord
之后,通过在本地访问 http://127.0.0.1:9001,并输入设定的用户名和密码,即可在浏览器中查看和管理所有进程状态。
相关问答 (FAQs)
问题1:我修改了 /etc/supervisord.d/ 目录下的配置文件,也执行了 supervisorctl reread,为什么程序还是没有按新配置启动?
回答: 这是一个常见的操作误区。supervisorctl reread 命令的作用仅仅是让 Supervisor 检测到配置文件的变更,它会告诉你哪些配置有了新的变化(available),但此时并不会真正应用这些变更(如启动新进程或重启旧进程),你必须接着执行 supervisorctl update 命令,Supervisor 才会根据 reread 的结果去实际地启动、停止或重启相应的进程,使配置生效,正确的流程是 reread update。
问题2:在 CentOS 7 中,已经有了 systemd 作为系统和服务管理器,为什么还需要 Supervisor?它们之间是什么关系?
回答: 这是一个很好的问题,systemd 和 Supervisor 的定位和职责有所不同,systemd 是一个系统级的 init 系统,负责管理整个系统的启动、服务(守护进程)和关机流程,而 Supervisor 是一个应用级的进程管理器,它们可以协同工作,形成一种层级管理关系:让 systemd 来管理 Supervisor 服务(确保 Supervisor 自身是稳定运行的),然后让 Supervisor 来管理具体的应用程序,这样做的好处是,Supervisor 在管理应用程序方面提供了比 systemd 更精细的功能,非常方便的崩溃自动重启策略、分组管理、独立的日志轮转、以及强大的 Web UI 和 RPC 接口,特别是对于那些非“守护化”设计(即不能自行在后台运行)的应用程序,Supervisor 能非常轻松地将它们“守护化”,最佳实践通常是:systemd 管理 Supervisor,Supervisor 管理你的应用。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复