1 安装 Supervisor

Supervisor 本身是一个特殊的 Erlang 进程,它可以通过定义监督策略来保证子进程的运行。监控子进程并在它们崩溃时自动重启,确保系统的稳定性和可靠性。

1.1 安装 setuptools

版本:setuptools-44.1.1.zip

适配Python2的最后一个版本

下载地址:https://pypi.org/project/setuptools/#files

setuptools-44.1.1.zip上传至/opt/src目录

## 解压
$ unzip -o -d /opt/ /opt/src/setuptools-44.1.1.zip
# -o: 不提示的情况下覆盖文件
# -d: 将文件解压缩到指定目录下
$ cd /opt/setuptools-44.1.1/

## 安装
$ python setup.py install

1.2 安装 Supervisor

版本:supervisor-4.2.5.tar.gz

下载地址:https://pypi.org/project/supervisor/#files

supervisor-4.2.5.tar.gz上传至/opt/src目录

## 解压
$ tar -zxvf /opt/src/supervisor-4.2.5.tar.gz -C /opt/
$ cd /opt/supervisor-4.2.5/

## 安装
$ python setup.py install

## 验证安装是否成功
$ supervisord --version

1.3 配置 Supervisor

$ echo_supervisord_conf > /etc/supervisord.conf

##存放每个进程的配置文件
$ mkdir -p /opt/supervisor/conf.d

$ mkdir -p /var/supervisor
$ touch /var/supervisor/supervisord.pid

$ mkdir -p /var/log/supervisor
$ touch /var/log/supervisor/supervisord.log
$ vim /etc/supervisord.conf

配置参考

[unix_http_server]
file=/var/supervisor/supervisor.sock

[supervisord]
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/supervisor/supervisord.pid

[supervisorctl]
serverurl=unix:////var/supervisor/supervisor.sock

[include]
files = /opt/supervisor/conf.d/*.conf

1.4 Supervisor 常用命令

## 启动 Supervisor
$ supervisord -c /etc/supervisord.conf

## 关闭 Supervisor
$ supervisorctl shutdown

## 重新启动 Supervisor 进程本身。这会导致所有受管理的进程(程序)重新启动。
# 当你对 supervisord 的主配置文件(通常是 /etc/supervisord.conf)做了修改,或者需要重新启动 Supervisor 来应用一些全局性的更改时使用。
# 重新启动 Supervisor 会停止并重新启动所有被其管理的进程。
$ supervisorctl reload

## 重新读取所有配置文件,以检测新的程序或删除的程序。
# 当你添加、删除或修改了 supervisor 的配置文件(如 /opt/supervisor/conf.d/ 目录下的文件),但不希望立即应用这些更改到正在运行的进程时使用。
# 这个命令仅会让 Supervisor 识别配置文件中的变化,但不会启动或停止任何程序。被添加的或被删除的程序仅会在之后的 update 操作时被启动或停止。
$ supervisorctl reread

## 根据 reread 命令的结果来启动新增的进程或停止已经被删除的进程。也会重新启动已修改配置的程序。
# 当你想让配置文件中的更改生效时使用,尤其是在你已经使用 reread 命令来检测配置文件变化之后。
# 新增的进程将会被启动,已删除的进程将会被停止,已经修改的进程将被重新启动。
$ supervisorctl update

## 启动程序,all表示启动所有程序。
$ supervisorctl start {PROGRAM< ...>}|all

## 停止程序,all表示停止所有程序。
$ supervisorctl stop {PROGRAM< ...>}|all

## 查看程序状态,如为all或不指定则查看所有程序状态。
$ supervisorctl status {PROGRAM< ...>}|all

## 重启程序,all表示重启所有程序。
$ supervisorctl restart {PROGRAM< ...>}|all

1.5 Supervisor 加入系统服务

1.5.1 创建 Supervisor 的 systemd 服务文件

supervisord 添加为 systemd 服务,为 supervisord 创建一个新的 systemd 服务文件。

$ vim /etc/systemd/system/supervisord.service

文件中添加以下内容:

[Unit]
Description=Supervisor process control
Documentation=http://supervisord.org
After=network.target

[Service]
ExecStart=/usr/bin/supervisord -n -c /etc/supervisord.conf
ExecStop=/usr/bin/supervisorctl shutdown
ExecReload=/usr/bin/supervisorctl reload
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

1.5.2 重新加载 systemd 配置

重新加载 systemd 配置,使新创建的 supervisord 服务文件生效:

$ systemctl daemon-reload

1.5.3 设置 supervisord 开机自启动

在系统启动时自动启动:

$ systemctl enable supervisord

1.5.4 启动 Supervisor 服务

$ systemctl start supervisord

1.5.5 检查服务状态

$ systemctl status supervisord

如果状态显示为 active (running),说明 supervisord 服务已成功启动并配置为开机自启。

2 管理应用

2.1 管理 SpringBoot 应用

创建 Spring Boot 应用的 Supervisor 配置文件。

[program:myapp]
command=java -jar /opt/myapp/myapp.jar
directory=/opt/myapp
autostart=true
autorestart=true
stderr_logfile=/var/log/myapp.err.log
stdout_logfile=/var/log/myapp.out.log
user=your_username

whereis java 查询java全路径

配置选项说明:

  • command: 这是运行 Spring Boot 应用的命令。确保路径正确并且 java 可执行文件在系统的 PATH 中。
  • directory: 这是应用程序的工作目录。Supervisor 会在启动程序前切换到这个目录。
  • autostart: 设为 true,表示 Supervisor 在启动时会自动启动该应用。
  • autorestart: 设为 true,表示如果应用崩溃,Supervisor 会自动重启它。
  • stderr_logfile stdout_logfile: 指定错误日志和标准输出日志文件的路径,方便排查问题。
  • user: 指定用哪个用户来运行程序(推荐用非 root 用户)。

2.2 管理 Nginx

mkdir -p /var/log/nginx

vim /opt/supervisor/conf.d/nginx.conf

文件中添加以下内容:

[program:nginx]
command=/usr/local/bin/nginx -g 'daemon off;'
autostart=true
autorestart=true
stderr_logfile=/var/log/nginx/nginx.err.log
stdout_logfile=/var/log/nginx/nginx.out.log
user=root

配置选项说明:

  • command: 这是运行 Nginx 的命令。-g 'daemon off;' 参数告诉 Nginx 以前台模式运行,这样 Supervisor 可以管理它。
  • autostart: 设为 true,表示 Supervisor 在启动时会自动启动 Nginx。
  • autorestart: 设为 true,表示如果 Nginx 崩溃,Supervisor 会自动重启它。
  • stderr_logfile stdout_logfile: 指定错误日志和标准输出日志文件的路径,方便排查问题。
  • user: 通常运行 Nginx 需要 root 权限,因为它需要监听 80 或 443 等低端口。如果你有特定的非 root 用户用于运行 Nginx,你可以更改此选项。

重新加载 Supervisor 配置并启动 Nginx

$ supervisorctl reread
$ supervisorctl update

检查 Nginx 的状态

$ supervisorctl status nginx

2.3 管理 Redis

mkdir -p /var/log/redis

vim /opt/supervisor/conf.d/redis.conf

文件中添加以下内容:

[program:redis]
command=/opt/redis/bin/redis-server /opt/redis/bin/redis.conf
autostart=true
autorestart=true
stderr_logfile=/var/log/redis/redis.err.log
stdout_logfile=/var/log/redis/redis.out.log
user=root

配置选项说明:

  • command: 这是运行 Redis 的命令,指定了 Redis 的可执行文件和配置文件的路径。默认的 Redis 配置文件通常位于 /etc/redis.conf
  • autostart: 设为 true,表示 Supervisor 在启动时会自动启动 Redis。
  • autorestart: 设为 true,表示如果 Redis 崩溃,Supervisor 会自动重启它。
  • stderr_logfile stdout_logfile: 指定错误日志和标准输出日志文件的路径,方便排查问题。
  • user: 指定为 redis 用户,确保 Redis 以合适的权限运行。

重新加载 Supervisor 配置并启动 Redis

$ supervisorctl reread
$ supervisorctl update

检查 Redis 的状态

$ supervisorctl status redis

为了让 Supervisor 正确管理 Redis,daemonize 应该设置为 no