在 Linux 服务器运维中,Nginx 作为常用的高性能 Web 服务器,其持续稳定运行直接影响业务可用性。但实际场景中,服务器资源不足、配置冲突或意外故障等问题,可能导致 Nginx 意外停止,若未及时处理会造成服务中断。
本文将详细介绍如何通过编写 Linux Shell 脚本,实时检测 Nginx 运行状态,一旦发现服务挂掉便自动重启,同时提供适配宝塔面板与通用环境的配置方案,还附带 NMP(Nginx+MySQL+PHP+Redis)全服务监控重启脚本,助力运维人员提升服务器稳定性。
一、背景:为何需要 Nginx 自动监控重启?
二、宝塔面板环境:快速配置 Nginx 自动监控
1. 进入计划任务模块
2. 新建 Shell 脚本任务
#!/bin/bash
# 功能:检测Nginx运行状态,异常时自动重启
# 通过访问本地Nginx状态页判断服务是否正常(需确保nginx_status配置已开启)
curl -s http://127.0.0.1/nginx_status > /dev/null 2>&1
# 判断上一条命令执行结果,非0表示Nginx未运行
if [ $? -ne 0 ]
then
echo "【$(date +"%Y-%m-%d %H:%M:%S")】Nginx未运行,正在重启..."
/etc/init.d/nginx restart # 执行Nginx重启命令
else
echo "【$(date +"%Y-%m-%d %H:%M:%S")】Nginx运行正常"
fi
3. 保存并测试
三、通用 Linux 环境:手动配置 Nginx 监控脚本
1. 制作 Nginx 监控脚本
步骤 1:创建脚本文件
touch /root/dr_check_nginx.sh
步骤 2:编写脚本内容
vi /root/dr_check_nginx.sh
按下i
键进入编辑模式,粘贴以下代码,代码通过统计 Nginx 进程数判断服务状态(无需依赖nginx_status
配置,兼容性更强):
#!/bin/bash
# 功能:通过进程数检测Nginx状态,自动重启服务
# 统计包含“nginx”关键词的进程数,排除grep自身进程(避免统计干扰)
nginx_procnum=`ps -ef | grep "nginx" | grep -v grep | wc -l`
# 进程数为0表示Nginx未运行,执行重启命令;否则提示正常
if [ $nginx_procnum -eq 0 ]
then
echo "【$(date +"%Y-%m-%d %H:%M:%S")】Nginx未运行,正在启动..."
/etc/init.d/nginx start # 启动Nginx(若需重启可改为restart,首次启动用start更稳妥)
else
echo "【$(date +"%Y-%m-%d %H:%M:%S")】Nginx运行正常,当前进程数:$nginx_procnum"
fi
步骤 3:赋予脚本执行权限
chmod +x /root/dr_check_nginx.sh
2. 添加定时任务(crontab)
步骤 1:编辑 crontab 任务列表
crontab -e
步骤 2:添加 Nginx 监控任务
# Nginx自动监控重启任务:每15分钟执行一次脚本
*/15 * * * * /bin/bash /root/dr_check_nginx.sh >> /root/dr_check_nginx.log 2>&1
步骤 3:保存并生效
四、进阶:NMP 全服务监控重启脚本
1. 脚本内容
#!/bin/bash
# 功能:监控Nginx、PHP-FPM、MySQL、Redis服务,异常时自动重启
# 1. 监控PHP-FPM(需注意PHP版本,此处为7.1,若为其他版本需修改为对应服务名,如php-fpm-74)
phpfpm_procnum=`ps -ef | grep "php-fpm" | grep -v grep | wc -l`
if [ $phpfpm_procnum -eq 0 ]
then
echo "【$(date +"%Y-%m-%d %H:%M:%S")】PHP-FPM未运行,正在重启..."
/etc/init.d/php-fpm-71 start
else
echo "【$(date +"%Y-%m-%d %H:%M:%S")】PHP-FPM运行正常,进程数:$phpfpm_procnum"
fi
# 2. 监控Nginx
nginx_procnum=`ps -ef | grep "nginx" | grep -v grep | wc -l`
if [ $nginx_procnum -eq 0 ]
then
echo "【$(date +"%Y-%m-%d %H:%M:%S")】Nginx未运行,正在重启..."
/etc/init.d/nginx start
else
echo "【$(date +"%Y-%m-%d %H:%M:%S")】Nginx运行正常,进程数:$nginx_procnum"
fi
# 3. 监控MySQL(服务名可能为mysqld或mysql,根据实际环境调整)
mysql_procnum=`ps -ef | grep "mysqld" | grep -v grep | wc -l`
if [ $mysql_procnum -eq 0 ]
then
echo "【$(date +"%Y-%m-%d %H:%M:%S")】MySQL未运行,正在重启..."
/etc/init.d/mysql start
else
echo "【$(date +"%Y-%m-%d %H:%M:%S")】MySQL运行正常,进程数:$mysql_procnum"
fi
# 4. 监控Redis
redis_procnum=`ps -ef | grep "redis" | grep -v grep | wc -l`
if [ $redis_procnum -eq 0 ]
then
echo "【$(date +"%Y-%m-%d %H:%M:%S")】Redis未运行,正在重启..."
/etc/init.d/redis start
else
echo "【$(date +"%Y-%m-%d %H:%M:%S")】Redis运行正常,进程数:$redis_procnum"
fi
2. 使用说明
五、注意事项与优化建议
© 版权声明
文章版权归原作者所有,本站只做转载和学习以及开发者个人原创。声明:下载本站资源即同意用户协议,本站程序仅供内部学习研究软件设计思想和原理使用,学习研究后请自觉删除,请勿传播,因未及时删除所造成的任何后果责任自负。
THE END
暂无评论内容