Linux Shell 脚本实现 Nginx 自动重启:实时监控保障服务稳定运行

在 Linux 服务器运维中,Nginx 作为常用的高性能 Web 服务器,其持续稳定运行直接影响业务可用性。但实际场景中,服务器资源不足、配置冲突或意外故障等问题,可能导致 Nginx 意外停止,若未及时处理会造成服务中断。

20250912125715353-image

本文将详细介绍如何通过编写 Linux Shell 脚本,实时检测 Nginx 运行状态,一旦发现服务挂掉便自动重启,同时提供适配宝塔面板与通用环境的配置方案,还附带 NMP(Nginx+MySQL+PHP+Redis)全服务监控重启脚本,助力运维人员提升服务器稳定性。

一、背景:为何需要 Nginx 自动监控重启?

此前,我们曾分享过 Linux Shell 脚本监控 MySQL 状态并自动重启的方案,有效解决了数据库意外停止的问题。近期有用户反馈,新部署的服务器出现 Nginx 诡异中断的情况,虽经排查解决了当下问题,但为避免后续同类故障影响业务,特开发 Nginx 实时监控脚本。
需注意:脚本的核心作用是 “应急兜底”,若 Nginx 频繁停止,需优先排查根本原因(如服务器内存溢出、端口占用、配置文件错误等),而非仅依赖脚本重启。

二、宝塔面板环境:快速配置 Nginx 自动监控

宝塔面板提供了可视化的计划任务功能,无需手动配置定时任务,适合对 Linux 命令不熟悉的运维人员,具体步骤如下:

1. 进入计划任务模块

登录宝塔面板后,在左侧菜单栏找到 “计划任务”,点击进入任务配置页面。

2. 新建 Shell 脚本任务

  • 任务类型:下拉选择 “Shell 脚本”(指定任务执行的脚本类型);
  • 执行周期:选择 “N 分钟”,并在输入框填写 “15”(表示每 15 分钟检测一次,可根据业务需求调整,如高频检测填 5,低频填 30);
  • 脚本内容:复制以下代码粘贴至输入框,代码功能为检测 Nginx 状态,未运行则重启:
#!/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. 保存并测试

点击 “保存” 按钮完成任务创建,可手动点击 “执行” 按钮测试脚本是否生效。若 Nginx 当前运行正常,会输出 “Nginx 运行正常”;若手动停止 Nginx(执行/etc/init.d/nginx stop),再执行脚本则会触发重启。

三、通用 Linux 环境:手动配置 Nginx 监控脚本

若服务器未使用宝塔面板(如原生 Linux 系统、其他运维面板),需手动创建脚本并配置定时任务,步骤分为 “制作脚本” 和 “添加定时任务” 两部分。

1. 制作 Nginx 监控脚本

步骤 1:创建脚本文件

通过 SSH 工具登录服务器,执行以下命令在root目录下创建脚本文件dr_check_nginx.sh(文件名可自定义,建议包含 “check”“nginx” 等关键词,便于识别):
touch /root/dr_check_nginx.sh

步骤 2:编写脚本内容

使用vinano编辑器打开脚本文件(以vi为例):
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
按下Esc键,输入:wq保存并退出编辑器。

步骤 3:赋予脚本执行权限

新创建的脚本文件默认无执行权限,需通过chmod命令赋予可执行权限:
chmod +x /root/dr_check_nginx.sh
可执行/root/dr_check_nginx.sh测试脚本,验证输出是否正常。

2. 添加定时任务(crontab)

通过 Linux 自带的crontab工具配置定时任务,实现脚本周期性执行。

步骤 1:编辑 crontab 任务列表

执行以下命令打开 crontab 编辑界面:
crontab -e
若首次使用,会提示选择编辑器(如nano“1”、vi“2”),选择常用的编辑器即可。

步骤 2:添加 Nginx 监控任务

在编辑界面末尾添加以下内容,设置每 15 分钟执行一次脚本:
# Nginx自动监控重启任务:每15分钟执行一次脚本
*/15 * * * * /bin/bash /root/dr_check_nginx.sh >> /root/dr_check_nginx.log 2>&1
  • 格式说明:*/15 * * * *代表 “每 15 分钟”(crontab 时间格式:分 时 日 月 周);
  • 日志输出:>> /root/dr_check_nginx.log 2>&1表示将脚本执行日志保存到dr_check_nginx.log文件,便于后续排查问题(可选,若无需日志可删除该部分)。

步骤 3:保存并生效

  • 若使用nano编辑器:按下Ctrl+O保存,再按Ctrl+X退出;
  • 若使用vi编辑器:按下Esc,输入:wq保存退出。

 

crontab 会自动加载新任务,无需额外重启服务,可通过cat /root/dr_check_nginx.log查看日志,确认任务是否正常执行。

四、进阶:NMP 全服务监控重启脚本

若服务器部署了完整的 Web 服务环境(Nginx+MySQL+PHP-FPM+Redis),可使用以下脚本同时监控 4 个服务,某一服务挂掉时自动重启,减少单独配置多个脚本的麻烦。

1. 脚本内容

创建脚本文件dr_check_nmp.sh(路径建议仍为/root目录),内容如下:
#!/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. 使用说明

  • 适配调整:若 PHP 版本为 7.4,需将php-fpm-71改为php-fpm-74;若 MySQL 服务名为mysqld,需将/etc/init.d/mysql改为/etc/init.d/mysqld(可通过ls /etc/init.d/查看实际服务名);
  • 权限与定时任务:参考 “通用 Linux 环境” 的步骤,赋予脚本执行权限(chmod +x /root/dr_check_nmp.sh),并添加 crontab 定时任务(如每 20 分钟执行一次)。

五、注意事项与优化建议

  1. 日志管理:建议保留脚本执行日志(如上文的dr_check_nginx.log),便于追溯服务中断原因,日志文件可定期清理(如通过定时任务删除 30 天前的日志);
  2. 服务名适配:不同 Linux 发行版(如 CentOS、Ubuntu)的服务名可能不同,例如 Ubuntu 中 MySQL 服务名可能为mysql,CentOS 可能为mysqld,需根据实际环境调整脚本中的服务名和启动命令;
  3. 高频检测风险:若将检测周期设置过短(如 1 分钟内多次检测),可能增加服务器资源消耗,建议根据业务重要性设置 5-30 分钟的检测间隔;
  4. 根本原因排查:若脚本频繁触发重启,需通过dmesg(查看系统日志)、nginx -t(检查 Nginx 配置)、free -m(查看内存)等命令排查根本问题,避免 “治标不治本”。

 

通过以上脚本和配置方法,可实现 Nginx 及相关服务的自动化监控与重启,降低人工运维成本,提升服务器服务的稳定性。若在使用过程中遇到问题,可参考脚本来源链接获取更多技术支持。

 

🎀 🌸

📜 重要提示:
如有解压密码:看下载页、看下载页、看下载页。
源码工具资源类具有可复制性: 建议具有一定思考和动手能力的用户购买。
请谨慎考虑: 小白用户和缺乏思考动手能力者不建议赞助。
虚拟商品购买须知: 虚拟类商品,一经打赏赞助,不支持退款。请谅解,谢谢合作!
邻兔跃官网:lt.lintuyue.com(如有解压密码看下载页说明)。

文章版权声明 1、本网站名称:邻兔跃lT
2、本站永久网址:https://lt.lintuyue.com/
3、本站内容主要来源于互联网优质资源整合、网友积极投稿以及部分原创内容,仅供内部学习研究软件设计思想和原理使用,学习研究后请自觉删除,请勿传播,因未及时删除所造成的任何后果责任自负,如有侵权,请联系站长进行删除处理。
4、本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
6、本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容