在使用国内宝塔面板部署安装 WordPress 网站的过程中,不少用户可能会遇到 Nginx 服务器在并发较高时自动宕机的问题,这将导致服务器上所有网站无法访问。本教程将介绍一种通过编写自动脚本并设置计划任务来解决此问题的方法。
脚本功能概述
我们编写的脚本名为check_nginx.sh
,其主要功能是定时检查 Nginx 服务是否正在运行。如果检测到 Nginx 服务停止,脚本会尝试重启 Nginx,并将每次重启的结果记录到指定的日志文件中,方便在宝塔面板的 Nginx 服务器管理窗口查看。
脚本代码详解
1. 设置日志文件路径
LOG_FILE="/www/wwwlogs/nginx_error.log"
这里定义了 Nginx 错误日志的存放路径,后续所有的重启记录都将写入该文件。
2. 确保日志目录存在
mkdir -p $(dirname "$LOG_FILE")
这行代码用于创建日志文件所在的目录(如果目录不存在的话)。dirname "$LOG_FILE"
用于获取日志文件路径中的目录部分,mkdir -p
则会递归创建目录,确保日志文件有合适的存放位置。
3. 定义日志记录函数
log_message() {
local MESSAGE=$1
echo "$(date '+%Y-%m-%d %H:%M:%S'): $MESSAGE" >> $LOG_FILE
}
这个函数用于统一日志的格式。它接受一个消息参数MESSAGE
,然后将当前时间和消息内容按照特定格式写入到LOG_FILE
指定的日志文件中。
4. 检测并重启 Nginx
if! systemctl is-active --quiet nginx; then
# 尝试重启 Nginx
systemctl start nginx
if [ $? -ne 0 ]; then
# 重启失败,记录日志
log_message "Nginx restart failed"
else
# 重启成功,记录日志
log_message "Nginx restarted successfully"
fi
fi
首先,systemctl is-active --quiet nginx
用于检查 Nginx 服务是否处于活动状态。如果返回值不为 0(即 Nginx 未运行),则执行systemctl start nginx
尝试重启 Nginx。$?
是上一个命令的返回值,通过判断$? -ne 0
来确定重启是否成功。如果重启失败,调用log_message
函数记录 “Nginx restart failed”;如果重启成功,则记录 “Nginx restarted successfully”。
综上,完成代码如下:
#!/bin/bash
LOG_FILE="/www/wwwlogs/nginx_error.log"
# 确保日志目录存在
mkdir -p $(dirname "$LOG_FILE")
# 定义日志记录函数,统一日志格式
log_message() {
local MESSAGE=$1
echo "$(date '+%Y-%m-%d %H:%M:%S'): $MESSAGE" >> $LOG_FILE
}
# 检测 Nginx 是否运行
if ! systemctl is-active --quiet nginx; then
# 尝试重启 Nginx
systemctl start nginx
if [ $? -ne 0 ]; then
# 重启失败,记录日志
log_message "Nginx restart failed"
else
# 重启成功,记录日志
log_message "Nginx restarted successfully"
fi
fi
设置计划任务
- 将
check_nginx.sh
脚本放置在/www/wwwroot/
目录中。 - 登录宝塔面板,在面板中找到计划任务功能模块。
- 添加一个新的计划任务,在命令输入框中填写:
bash -x /www/wwwroot/check-nginx.sh
,并设置执行周期为每 5 分钟执行一次,当然,你也可以根据需要,设定一个你想要的检测间隔。
通过以上步骤,我们就实现了一个简单而有效的 Nginx 自动检测与重启机制,能够在一定程度上应对因并发过高导致的 Nginx 宕机问题,保障网站的正常运行。在实际使用过程中,还可以根据服务器的性能和网站的流量情况,进一步优化 Nginx 的配置参数,以提高其并发处理能力。