一、项目背景与核心诉求
二、配置迭代时间线与分析思路
三、关键版本核心差异对比
<<<<
| 对比维度</ | 最初版</ | 中间优化版</ | 最终版</ |
|---|---|---|---|
| 检测逻辑 | 监控bash进程 | 端口监听检测 → URL返回码检测 | 仅URL返回码检测(http://182.106.136.56) |
| 端口处理 | 80/443/888强杀 | 端口清理+监听检测+冲突检测 | 仅80/443/888强杀(兜底启动) |
| 功能模块 | 单行命令配置 | 主配置+4个脚本+日志轮转 | 主配置+2个核心脚本(极简) |
| 异常处理 | 仅解决端口占用 | 多场景异常处理+失败计数+超时控制 | 按返回码精准处理(200/404/500/其他) |
| 管理权 | 小皮面板为主 | Supervisor完全接管 | Supervisor完全接管(无冗余依赖) |
四、核心修改点详细说明
1. 检测逻辑演进(最关键修改)
curl_check() {
local code=$(curl $CHECK_URL -m $CURL_TIMEOUT -s -w “%{http_code}” -o /dev/null)
echo “$code”
}
2. 系统兼容性适配
3. 端口管理优化
4. 异常处理规则优化
五、采用最终方案的原因
1. 精准匹配核心诉求
2. 逻辑极简,维护成本低
3. 执行高效,资源占用少
4. 异常处理精准
5. 完全适配目标环境
六、最终方案核心配置(备查)
1. Supervisor主配置文件(supervisord.conf)
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)
# ========== 核心配置 ==========
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)
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
七、部署与验证命令(最终版)
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