我想写一些东西,当我的 apache 服务器死机时重新启动 httpd 服务

我想写一些东西,当我的 apache 服务器死机时重新启动 httpd 服务

我是一个中型烹饪博客的“系统管理员”,这个博客运行在 t2.small EC2 实例上,并在 LAMP 堆栈上使用 WordPress。尽管我是一个相当糟糕的“系统管理员”,但它实际上运行得非常可靠和高效,尽管传输了大量流量。我已经尽了一切努力,但时不时(大约每年一次)有人会设法用 DDOS 类型的攻击来攻击它。通常发生的情况是 apache 服务器死机,任何人从网站请求任何内容都会发生 HTTP 超时。重新启动 httpd 服务可以立即解决问题。

我正在考虑安排一个 CRON 作业,每 5 分钟调用一次网站,如果发现超时超过两次,它会重新启动 httpd 服务并向我发送电子邮件。现在,这不是那些“我无法正确设置我的 Apache 服务器,所以我每小时重新启动一次”的解决方案之一。Apache 经过调整,在没有被黑客入侵时运行良好。我已经尽可能多地采用了防火墙反黑客最佳实践。我的理由基本上是“黑客和疯子总是在寻找新的方法来攻击我,当他们这样做时,我宁愿有 10 分钟的中断和一封电子邮件,也不愿有几个小时的停机时间(如果我睡着了或不在的话)”。问题是,这是一个好的解决方案,还是有更好的、更系统管理的方式来使用一些现有技术来做到这一点?

注意:当我说 Apache 服务器死机时,当你运行 top -U apache 时,它​​实际上看起来没问题。它所做的就是写入大约 10

(12)无法分配内存:AH00159:fork:无法分叉新进程

到 error_log 并且直到重新启动才执行任何操作。

答案1

您可以通过检查命令的返回代码轻松完成此操作curl

#!/bin/bash
# Request website (timeout five seconds)
/usr/bin/curl -m5 $1 > /dev/null
RC=$?
if [ $RC -ne 0 ]; then
    echo Website: $1 not running, restarting apache. Curl RC: $RC
    /usr/sbin/service httpd restart
fi

其思想是,如果返回代码不等于 0,即请求失败,则重新启动 apache。

你可以将它放入 cron 中,如下所示:

*/5 * * * * /path/to/check_site.sh website.url.com >> /path/to/log/file.log 2>&1

这将确保它正在记录结果。

注意:这是创可贴。最好贴上去,确保它不会反复运行。也许可以放一条send me an email线?

答案2

有一段时间,微软忽略了 robots.txt,并用他们的搜索引擎爬虫攻击我的服务器。当服务器变慢时,我会看到多达 200 个 httpd 实例,其中大多数是 Microsoft 爬虫!因此,我实施了以下脚本,该脚本检查正在运行的 httpd 实例数量,如果超过一定数量,则将其全部终止。

这相当简单。您可以将第 5 行上的 httpd 实例数从“30”更改为您喜欢的任何值。您可以通过将“sleep 30”更改为您喜欢的任意秒数来更改监控间隔时间。我研究过只杀死 Microsoft 爬虫实例,但这需要解析 apache 日志,我不想这样做。

#!/bin/bash
while [ 1 ]
    do
    set `psg httpd | wc`
    if test $1 -gt 30
    then
        echo killing
        killall httpd
    else
        echo -n $1 ' '
    fi
    sleep 30
done

相关内容