Supervisor+Nginx 配置迭代总结报告

一、项目背景与核心诉求

• 适配环境:小皮面板 + 低版本 Supervisor + Linux 服务器(最终适配 Ubuntu 22.04)
• 核心问题:Nginx 端口占用、手动 stop 不重启、面板显示“运行中”但网站实际挂掉(僵尸主进程)
• 最终目标:实现 Nginx 稳定运行,精准检测网站可用性,自动处理异常场景

二、配置迭代时间线与分析思路

版本1:最初版
分析思路:聚焦核心问题,先解决端口占用,保留基础启动逻辑
核心实现:保留强杀端口命令、Nginx启动命令和基础参数
存在缺陷:仅监控 bash 进程,无法检测 Nginx 实际状态,管理权归属混乱

版本2:功能扩展版
分析思路:拆分功能模块,增强鲁棒性,将配置拆分为主配置+脚本文件
核心实现:新增启动前置清理脚本、健康检查脚本、一键管理脚本
优化点:实现进程清理、端口检测、日志记录的分离管理

版本3:Ubuntu 22.04适配版
分析思路:解决系统兼容性问题,替换Ubuntu 22.04缺失/失效的命令
核心修改:netstat→ss、pkill→pgrep+xargs、单引号→双引号
适配点:确保在目标系统中所有命令正常执行,无解析错误

版本4:888端口适配版
分析思路:补充端口覆盖范围,解决888端口占用导致的启动失败问题
核心修改:在端口清理、检测逻辑中新增888端口,排查命令同步更新
扩展点:覆盖业务所需的所有端口(80/443/888),避免遗漏场景

版本5:边界修复版
分析思路:优化极端场景处理,提升配置鲁棒性和运维体验
核心修改:新增PID合法性校验、端口检测逻辑优化、9001端口冲突检测
修复点:解决非数字PID导致脚本异常、单一端口通即误判等边界问题

版本6:URL检测版
分析思路:切换检测维度,从“端口监听”转为“实际业务可用性”
核心修改:用curl检测URL返回码替代端口监听检测,按返回码执行不同逻辑
核心优化:更贴近实际业务场景,避免“端口通但网站挂”的误判

版本7:最终版
分析思路:极简优化,保留核心功能,删除冗余逻辑,精准匹配需求
核心修改:仅保留URL返回码判定+端口强杀兜底,删除所有无用监控项
最终优化:逻辑清晰、执行高效、维护成本低,完全满足核心诉求

三、关键版本核心差异对比

<<<<

对比维度</ 最初版</ 中间优化版</ 最终版</
检测逻辑 监控bash进程 端口监听检测 → URL返回码检测 仅URL返回码检测(http://182.106.136.56)
端口处理 80/443/888强杀 端口清理+监听检测+冲突检测 仅80/443/888强杀(兜底启动)
功能模块 单行命令配置 主配置+4个脚本+日志轮转 主配置+2个核心脚本(极简)
异常处理 仅解决端口占用 多场景异常处理+失败计数+超时控制 按返回码精准处理(200/404/500/其他)
管理权 小皮面板为主 Supervisor完全接管 Supervisor完全接管(无冗余依赖)

四、核心修改点详细说明

1. 检测逻辑演进(最关键修改)

• 从“监控bash进程”→“端口监听检测”→“URL返回码检测”
• 原因:端口监听正常不代表网站可用(如僵尸主进程、应用层异常),URL返回码能直接反映业务状态
# 最终版核心检测逻辑
curl_check() {
local code=$(curl $CHECK_URL -m $CURL_TIMEOUT -s -w “%{http_code}” -o /dev/null)
echo “$code”
}

2. 系统兼容性适配

• netstat → ss:Ubuntu 22.04默认无netstat,ss命令功能一致且更高效
• pkill → pgrep+xargs:解决pkill在低版本Supervisor中匹配失效问题
• 单引号 → 双引号:解决Supervisor解析命令时的语法错误

3. 端口管理优化

• 新增888端口:覆盖业务所需端口,避免因888端口占用导致启动失败
• 删除端口监听检测:仅保留端口强杀功能,作为启动兜底(解决端口占用坑)
• 原因:端口监听状态无实际业务意义,仅端口占用会影响启动

4. 异常处理规则优化

• 返回码200:静默运行,重置失败计数(正常业务状态)
• 返回码404/500:记录日志,不重启(业务异常需手动处理)
• 其他返回码:连续2次失败→强杀端口+重启Nginx(系统层面异常)
• 原因:区分业务异常和系统异常,避免无效重启和数据丢失

五、采用最终方案的原因

1. 精准匹配核心诉求

• 最终方案仅聚焦“网站可用”这一核心目标,所有逻辑围绕URL返回码展开,解决了最初的所有问题(端口占用、自动重启、防僵尸进程)

2. 逻辑极简,维护成本低

• 删除了中间版本中冗余的端口监听检测、PID校验、9001端口冲突检测等功能,仅保留核心必要逻辑,后期维护无需关注过多细节

3. 执行高效,资源占用少

• 检测间隔15秒,curl超时2秒,无复杂循环和多重判断,对服务器资源占用极低,适合长期稳定运行

4. 异常处理精准

• 按返回码区分不同异常场景,避免了“一刀切”的重启策略,减少因不必要的重启导致的业务中断

5. 完全适配目标环境

• 解决了Ubuntu 22.04的兼容性问题,同时适配低版本Supervisor,无依赖冲突,部署后可直接稳定运行

六、最终方案核心配置(备查)

1. Supervisor主配置文件(supervisord.conf)

[inet_http_server]
port=127.0.0.1:9001
[supervisord]
logfile=/xp/server/supervisor/log/supervisord.log
logfile_maxbytes=50MB
logfile_backups=10
loglevel=info
pidfile=/xp/server/supervisor/supervisord.pid
nodaemon=false
minfds=1024
minprocs=200
user=root
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=http://127.0.0.1:9001
[program:nginx]
command=/xp/server/nginx/sbin/nginx -g “daemon off;”
autostart=true
autorestart=true
startretries=5
startsecs=10
stopwaitsecs=15
user=root
redirect_stderr=true
stdout_logfile=/xp/server/supervisor/log/nginx_main.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=5
stopasgroup=true
killasgroup=true
stopsignal=TERM
process_name=%(program_name)s
numprocs=1
[program:nginx_health]
command=/bin/bash /xp/server/nginx/nginx_health.sh
autostart=true
autorestart=true
startretries=3
startsecs=5
user=root
redirect_stderr=true
stdout_logfile=/xp/server/supervisor/log/nginx_health.log
stdout_logfile_maxbytes=5MB
stdout_logfile_backups=5
stopasgroup=false
killasgroup=false
process_name=%(program_name)s
numprocs=1

2. 健康检查脚本(nginx_health.sh)

#!/bin/bash
# ========== 核心配置 ==========
CHECK_URL=”http://182.106.136.56″ # 唯一检测目标
CHECK_INTERVAL=15 # 每15秒检测1次
CURL_TIMEOUT=2 # curl超时2秒
LOG_FILE=”/xp/server/supervisor/log/nginx_health.log”
MAX_FAIL_TIMES=2 # 连续2次失败触发重启
FAIL_COUNT=0 # 失败计数初始化
# ========== 初始化 ==========
[ ! -d “$(dirname $LOG_FILE)” ] && mkdir -p “$(dirname $LOG_FILE)” && chmod 755 “$(dirname $LOG_FILE)”
# ========== 函数:执行curl检测 ==========
curl_check() {
local code=$(curl $CHECK_URL -m $CURL_TIMEOUT -s -w “%{http_code}” -o /dev/null)
echo “$code”
}
# ========== 函数:强杀80/443/888端口+Nginx进程(兜底) ==========
force_clean() {
echo “[$(date)] 开始强制清理80/443/888端口+Nginx进程” >> “$LOG_FILE”
for PORT in 80 443 888; do
PID=$(ss -tunlp 2>/dev/null | grep -E “:$PORT\s” | awk ‘{print $7}’ | cut -d’/’ -f1 | head -1)
if [ -n “$PID” ] && [[ “$PID” =~ ^[0-9]+$ ]]; then
kill -9 “$PID” 2>/dev/null
echo “[$(date)] 强制杀死端口$PORT占用进程:$PID” >> “$LOG_FILE”
fi
done
pgrep -f “nginx: master process” | xargs -r kill -9 2>/dev/null
pgrep -f “nginx: worker process” | xargs -r kill -9 2>/dev/null
echo “[$(date)] 强制清理完成:80/443/888端口+Nginx进程已杀死” >> “$LOG_FILE”
}
# ========== 函数:重启Nginx(通过Supervisor) ==========
restart_nginx() {
echo “[$(date)] 触发Nginx重启(通过Supervisor)” >> “$LOG_FILE”
/xp/server/supervisor/supervisorctl -c /xp/server/supervisor/supervisord.conf restart nginx 2>> “$LOG_FILE”
echo “[$(date)] Nginx重启命令已执行” >> “$LOG_FILE”
}
# ========== 启动提示 ==========
echo “[$(date)] Nginx健康检查启动,仅检测URL:$CHECK_URL 返回码,每${CHECK_INTERVAL}秒检测1次” >> “$LOG_FILE”
# ========== 主循环(核心逻辑) ==========
while true; do
CODE=$(curl_check)
if [ “$CODE” = “200” ]; then
FAIL_COUNT=0
elif [ “$CODE” = “404” ] || [ “$CODE” = “500” ]; then
echo “[$(date)] 业务异常:URL返回码$CODE,需手动处理(不触发重启)” >> “$LOG_FILE”
FAIL_COUNT=0
else
FAIL_COUNT=$((FAIL_COUNT + 1))
echo “[$(date)] 检测失败:URL返回码$CODE,失败计数+1(当前:$FAIL_COUNT)” >> “$LOG_FILE”
if [ $FAIL_COUNT -eq $MAX_FAIL_TIMES ]; then
echo “[$(date)] 连续${MAX_FAIL_TIMES}次检测失败,触发修复逻辑” >> “$LOG_FILE”
force_clean
restart_nginx
FAIL_COUNT=0
echo “[$(date)] 修复逻辑执行完成,重置失败计数为0” >> “$LOG_FILE”
fi
fi
sleep $CHECK_INTERVAL
done

3. 一键管理脚本(nginx_manage.sh)

#!/bin/bash
LOG_DIR=”/xp/server/supervisor/log”
[ ! -d “$LOG_DIR” ] && mkdir -p “$LOG_DIR” && chmod 755 “$LOG_DIR”
SUPERVISORCTL_BIN=”/xp/server/supervisor/supervisorctl”
SUPERVISOR_CONF=”/xp/server/supervisor/supervisord.conf”
# 基础依赖检查
check_dependencies() {
local error=0
if [ ! -x “$SUPERVISORCTL_BIN” ]; then
echo “[$(date)] 错误:$SUPERVISORCTL_BIN 不存在或无执行权限” >> “$LOG_DIR/nginx_manage.log”
error=1
fi
if [ ! -f “$SUPERVISOR_CONF” ]; then
echo “[$(date)] 错误:$SUPERVISOR_CONF 配置文件不存在” >> “$LOG_DIR/nginx_manage.log”
error=1
fi
if [ $error -ne 0 ]; then
exit 1
fi
}
check_dependencies
case “$1” in
start)
$SUPERVISORCTL_BIN -c $SUPERVISOR_CONF start nginx nginx_health 2>> “$LOG_DIR/nginx_manage.log”
echo “[$(date)] Nginx启动完成,状态如下:” >> “$LOG_DIR/nginx_manage.log”
$SUPERVISORCTL_BIN -c $SUPERVISOR_CONF status >> “$LOG_DIR/nginx_manage.log” 2>&1
$SUPERVISORCTL_BIN -c $SUPERVISOR_CONF status
;;
restart)
for PORT in 80 443 888; do
PID=$(ss -tunlp 2>/dev/null | grep -E “:$PORT\s” | awk ‘{print $7}’ | cut -d’/’ -f1 | head -1)
if [ -n “$PID” ] && [[ “$PID” =~ ^[0-9]+$ ]]; then
kill -9 “$PID” 2>/dev/null
fi
done
pgrep -f “nginx: master process” | xargs -r kill -9 2>/dev/null
pgrep -f “nginx: worker process” | xargs -r kill -9 2>/dev/null$SUPERVISORCTL_BIN -c $SUPERVISOR_CONF restart nginx nginx_health 2>> “$LOG_DIR/nginx_manage.log”
echo “[$(date)] Nginx重启完成,状态如下:” >> “$LOG_DIR/nginx_manage.log”
$SUPERVISORCTL_BIN -c $SUPERVISOR_CONF status >> “$LOG_DIR/nginx_manage.log” 2>&1
$SUPERVISORCTL_BIN -c $SUPERVISOR_CONF status
;;
status)
$SUPERVISORCTL_BIN -c $SUPERVISOR_CONF status nginx nginx_health
;;
*)
echo “使用方法:$0 {start|restart|status}”
exit 1
;;
esac
exit 0

七、部署与验证命令(最终版)

# 1. 给脚本赋执行权限
chmod +x /xp/server/nginx/nginx_health.sh
chmod +x /xp/server/nginx/nginx_manage.sh# 2. 停止旧进程(如有)
/xp/server/supervisor/supervisorctl -c /xp/server/supervisor/supervisord.conf stop all# 3. 重启Supervisor加载新配置
pkill -9 supervisord
/xp/server/supervisor/supervisord -c /xp/server/supervisor/supervisord.conf# 4. 启动Nginx+健康检查
/xp/server/nginx/nginx_manage.sh start# 5. 验证检测是否生效(手动执行curl)
curl http://182.106.136.56 -m 2 -s -w “%{http_code}” -o /dev/null# 6. 常用排查命令
tail -f /xp/server/supervisor/log/nginx_health.log # 实时查看健康检查日志
/xp/server/nginx/nginx_manage.sh status # 查看Nginx状态
/xp/server/nginx/nginx_manage.sh restart # 一键重启Nginx

给 Nginx 装个 “守护保镖”——Supervisor 配置折腾记

前段时间服务器上的 Nginx 总出幺蛾子:主进程时不时就崩,每次都得手动重启才能恢复服务。虽说临时重启能解决问题,但总不能一直盯着,趁着今天有空,干脆彻底把这个隐患解决掉。

先查了 Nginx 崩溃的原因,看日志和系统监控,大概率是内存溢出导致的 —— 于是先调整了 Nginx 的配置(比如优化 worker 进程数、调整连接数限制),至于能不能根治还得再观察。但光靠改配置不够,万一再崩了还是得手动处理,索性决定装个 Supervisor 做监控,让它接管 Nginx 的启停:只要 Nginx 进程退出,Supervisor 就自动重启,彻底解放双手。

不过折腾的过程比预想中曲折。我的 Nginx 和 Supervisor 都是通过服务器面板装的,第一步就踩了坑 —— 得先把 Nginx 自带的自启动关掉,再把 Supervisor 的自启动打开,不然两者会 “抢着管” Nginx,导致进程混乱。

接下来的问题更具体:清理旧进程时,总有残留的 Nginx 进程杀不干净;端口也时不时被占用,导致新的 Nginx 进程启动失败;一开始想通过中间脚本(比如 nginx_manage.sh)来处理清场和启动,结果又遇到各种报错…… 前前后后试了好几种方案,比如把多行命令压缩成单行、彻底删除 Supervisor 残留的配置文件、注释掉多余的 [include] 加载项,才算把所有问题理顺。

最终看着两种崩溃场景(主进程单独崩、全进程被杀死)都能被 Supervisor 自动恢复,才算松了口气。把整个过程记下来,既是给自己留个笔记,也希望能给遇到类似问题的朋友做个参考 —— 毕竟折腾过的坑,能少一个是一个。

Supervisor 守护 Nginx 全流程总结

一、环境信息

组件 路径 / 版本 说明
Supervisor 配置路径:/xp/server/supervisor/supervisord.conf 面板安装(非 systemd 管理,通过进程检测状态)
Nginx 启动路径:/xp/server/nginx/sbin/nginx 需守护的 Web 服务,依赖 80/443/888 端口
关键端口 80(HTTP)、443(HTTPS)、888(面板) 需避免残留进程占用,否则 Nginx 启动失败
日志路径 /xp/server/supervisor/log/ 存放 Supervisor 主日志(supervisord.log)和 Nginx 运行日志(nginx.out.log)

二、核心问题与排查思路

1. 问题 1:Supervisor 配置解析报错

  • 现象:启动 Supervisor 时提示语法错误,指向 [program:nginx] 的 command 行
  • 原因:command 用多行写法,未正确闭合引号,Supervisor 无法识别换行符
  • 解决:将多行命令用 ; 压缩为单行,确保引号完整

2. 问题 2:Nginx 启动报 FATAL Exited too quickly

  • 现象:Supervisor 显示 Nginx 启动后立即退出,日志提示 bind() to 0.0.0.0:80 failed (98: Address already in use)
  • 原因:80/443/888 端口被残留进程(旧 Nginx 或其他服务)占用,清理不彻底
  • 解决:用 netstat 杀端口占用 + killall -9 nginx 补杀残留

3. 问题 3:提示 can’t find command ‘/usr/local/bin/nginx_manage.sh’

  • 现象:Supervisor 启动后 Nginx 状态为 FATAL,日志找不到旧脚本
  • 原因:[include] 目录(/xp/server/supervisor/conf.d/)有残留配置,仍调用已删除的旧脚本
  • 解决:删除 conf.d/ 下所有文件,或注释主配置中的 [include] 指令

4. 问题 4:systemctl status supervisord 检测不到进程

  • 现象:systemd 命令显示 Supervisor 为 inactive (dead),但 Nginx 能正常运行
  • 原因:Supervisor 由面板安装,用自定义进程管理(非 systemd 服务)
  • 解决:用 pgrep -f “supervisord” 直接检测进程,或 supervisorctl status 验证管理状态

三、完整操作步骤(含命令)

步骤 1:清理旧环境(避免残留干扰)

# 1. 强制杀死所有 Supervisor 和 Nginx 进程
pkill -9 supervisord
pkill -9 nginx
killall -9 nginx 2>/dev/null # 屏蔽“无进程可杀”的报错
# 2. 清理 80/443/888 端口占用(即使非 Nginx 占用也强制杀)
netstat -tunlp | grep -E ‘:80|:443|:888’ | awk ‘{print $7}’ | cut -d’/’ -f1 | sort -u | xargs -I {} kill -9 {} 2>/dev/null
# 3. 验证清理结果(无输出即成功)
echo “=== 清理验证 ===”
pgrep supervisord && echo “❌ 残留 Supervisor 进程” || echo “✅ Supervisor 已清理”
pgrep nginx && echo “❌ 残留 Nginx 进程” || echo “✅ Nginx 已清理”
netstat -tunlp | grep -E ‘:80|:443|:888’ && echo “❌ 端口仍被占用” || echo “✅ 端口已释放”

步骤 2:编辑 Supervisor 核心配置

2.1 打开配置文件

vim /xp/server/supervisor/supervisord.conf

2.2 完整配置

按 i 进入 vim 编辑模式,粘贴以下内容,按 Esc 退出编辑:

[inet_http_server]
port=127.0.0.1:9001 # 仅本地访问,安全优先
[supervisord]
logfile=/xp/server/supervisor/log/supervisord.log
logfile_maxbytes=50MB
logfile_backups=10
loglevel=info
pidfile=/xp/server/supervisor/supervisord.pid
nodaemon=false # 后台运行(默认正确)
minfds=1024
minprocs=200
user=root # root 权限确保杀进程/启动无问题
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///xp/server/supervisor/supervisor.sock
# 核心:Nginx 监控配置(单行命令,清场+启动一体化)
[program:nginx]
command=/bin/bash -c “netstat -tunlp | grep -E ‘:80|:443|:888’ | awk ‘{print $7}’ | cut -d’/’ -f1 | sort -u | xargs -I {} kill -9 {} 2>/dev/null; sleep 2; ps -ef | grep -i nginx | grep -v grep | awk ‘{print $2}’ | xargs -I {} kill -9 {} 2>/dev/null; sleep 2; /xp/server/nginx/sbin/nginx -g ‘daemon off;'”
autostart=true # Supervisor 启动时自动启动 Nginx
autorestart=true # Nginx 崩溃时自动重启(核心守护)
startretries=3 # 启动失败重试 3 次
startsecs=10 # 稳定运行 10 秒算启动成功
stopwaitsecs=10 # 停止时等待 10 秒再强制杀
user=root
redirect_stderr=true # 错误日志重定向到 stdout_logfile
stdout_logfile=/xp/server/supervisor/log/nginx.out.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=5
stopasgroup=true # 停止时连带杀子进程(worker)
killasgroup=true # 强制杀整个进程组
# 注释 include(避免加载残留配置)
;[include]
;files = /xp/server/supervisor/conf.d/*.conf

2.3 保存退出 vim

按 Esc 后,输入 :wq 并回车(wq = 保存并退出;若放弃修改输入 :q! 强制退出)

步骤 3:启动 Supervisor 并验证初始状态

# 1. 启动 Supervisor(加载新配置)
/xp/server/supervisor/supervisord -c /xp/server/supervisor/supervisord.conf
# 2. 等待 15 秒(给“清场+启动”命令执行时间)
sleep 15
# 3. 验证 Supervisor 进程
pgrep -f “supervisord” && echo “✅ Supervisor 启动成功” || echo “❌ Supervisor 启动失败”
# 4. 验证 Nginx 状态(需显示 RUNNING)
sudo /xp/server/supervisor/supervisorctl status nginx

步骤 4:验证两种崩溃场景(核心测试)

场景 1:Nginx 主进程单独崩溃

# 1. 记录当前主进程 PID
INITIAL_MASTER_PID=$(pgrep -f “nginx: master process”)
echo “当前 Nginx 主 PID:$INITIAL_MASTER_PID”
# 2. 杀死主进程(模拟崩溃)
kill -9 $INITIAL_MASTER_PID
echo “已杀死主进程(PID:$INITIAL_MASTER_PID)”
# 3. 等待 15 秒(Supervisor 自动重启)
sleep 15
# 4. 验证结果
NEW_MASTER_PID1=$(pgrep -f “nginx: master process”)
SUP_STATUS1=$(sudo /xp/server/supervisor/supervisorctl status nginx | awk ‘{print $2}’)
echo -e “\n=== 场景1结果 ===”
[ -n “$NEW_MASTER_PID1” ] && [ “$NEW_MASTER_PID1” != “$INITIAL_MASTER_PID” ] && echo “✅ 主进程自动重启成功(新 PID:$NEW_MASTER_PID1)” || echo “❌ 失败”
[ “$SUP_STATUS1” = “RUNNING” ] && echo “✅ Supervisor 守护正常” || echo “❌ 异常”

场景 2:Nginx 所有进程被杀死

# 1. 杀死所有 Nginx 进程(主进程+子进程)
pkill -9 nginx
killall -9 nginx 2>/dev/null
echo “已杀死所有 Nginx 进程”
# 2. 等待 15 秒
sleep 15
# 3. 验证结果
NEW_MASTER_PID2=$(pgrep -f “nginx: master process”)
SUP_STATUS2=$(sudo /xp/server/supervisor/supervisorctl status nginx | awk ‘{print $2}’)
PORT_CHECK=$(netstat -tunlp | grep -E ‘:80|:443|:888’ | grep nginx | wc -l)
echo -e “\n=== 场景2结果 ===”
[ -n “$NEW_MASTER_PID2” ] && [ “$NEW_MASTER_PID2” != “$NEW_MASTER_PID1” ] && echo “✅ 所有进程自动重启成功(新 PID:$NEW_MASTER_PID2)” || echo “❌ 失败”
[ “$SUP_STATUS2” = “RUNNING” ] && echo “✅ Supervisor 守护正常” || echo “❌ 异常”
[ “$PORT_CHECK” -ge 1 ] && echo “✅ 端口重新绑定成功” || echo “❌ 端口未绑定”

步骤 5:服务器重启后验证(确保开机自启)

# 1. 重启服务器
reboot
# 2. 重启后登录,验证 Supervisor 进程
pgrep -f “supervisord” && echo “✅ Supervisor 开机自启成功” || echo “❌ 需检查面板自启配置”
# 3. 验证 Nginx 状态
sudo /xp/server/supervisor/supervisorctl status nginx | grep “RUNNING” && echo “✅ Nginx 被自动管理” || echo “❌ 需重新配置”

四、常用管理命令(后续维护)

功能 命令
查看 Nginx 状态 sudo /xp/server/supervisor/supervisorctl status nginx
手动重启 Nginx sudo /xp/server/supervisor/supervisorctl restart nginx
停止 Nginx sudo /xp/server/supervisor/supervisorctl stop nginx
启动 Nginx sudo /xp/server/supervisor/supervisorctl start nginx
查看 Supervisor 日志 tail -n 50 /xp/server/supervisor/log/supervisord.log
查看 Nginx 运行日志 tail -n 50 /xp/server/supervisor/log/nginx.out.log
重启 Supervisor pkill -9 supervisord && /xp/server/supervisor/supervisord -c /xp/server/supervisor/supervisord.conf

五、最终效果

  1. 主进程崩溃:15 秒内自动重启,新进程接管服务
  2. 全进程被杀:自动清场端口 + 重启,端口重新绑定
  3. 服务器重启:Supervisor 随面板自启,Nginx 自动启动
  4. 无需手动干预:全程无人值守,确保网站稳定运行