如果无法获取文件,如何自动重新启动 Apache 和 Varnish?

如果无法获取文件,如何自动重新启动 Apache 和 Varnish?

当脚本无法获取 robots.txt 时,我需要重新启动 Apache 和 Varnish,并通过电子邮件发送一些日志,但我收到错误

./healthcheck: 43 [[: not found

我的服务器是 Ubuntu 12.04 64 位

#!/bin/sh
# Check if can fetch robots.txt if not then restart Apache and Varnish
# Send last few lines of logs with date via email

PATH=/bin:/usr/bin
THEDIR=/tmp/web-server-health
[email protected]
mkdir -p $THEDIR

if ( wget --timeout=30 -q -P $THEDIR http://website.com/robots.txt )
then
    # we are up
    touch ~/.apache-was-up
else
    # down! but if it was down already, don't keep spamming
    if [[ -f ~/.apache-was-up ]]
    then
        # write a nice e-mail
        echo -n "Web server down at " > $THEDIR/mail
        date >> $THEDIR/mail
        echo >> $THEDIR/mail
        echo "Apache Log:" >> $THEDIR/mail
        tail -n 30 /var/log/apache2/error.log >> $THEDIR/mail
        echo >> $THEDIR/mail
        echo "AUTH Log:" >> $THEDIR/mail
        tail -n 30 /var/log/auth.log >> $THEDIR/mail
        echo >> $THEDIR/mail
        # kick apache
        echo "Now kicking apache..." >> $THEDIR/mail
        /etc/init.d/varnish stop >> $THEDIR/mail 2>&1
        killall -9 varnishd >> $THEDIR/mail 2>&1
        /etc/init.d/varnish start >> $THEDIR/mail 2>&1
        /etc/init.d/apache2 stop >> $THEDIR/mail 2>&1
        killall -9 apache2 >> $THEDIR/mail 2>&1
        /etc/init.d/apache2 start >> $THEDIR/mail 2>&1
        # prepare the mail
        echo >> $THEDIR/mail
        echo "Good luck troubleshooting!" >> $THEDIR/mail
        # send the mail
        sendemail -o message-content-type=html -f [email protected] -t $EMAIL -u ALARM -m < $THEDIR/mail
        rm ~/.apache-was-up
    fi
fi

rm -rf $THEDIR

答案1

if [[ -f ~/.apache-was-up ]]

在 Ubuntu 中,/bin/sh符号链接指向短跑代替狂欢。dash 是专为脚本设计的极简 shell,而 bash 功能更强大,专为交互使用而设计。该[[ <expression> ]]语法仅在 bash 中实现,而不是在 dash 中实现,因此您会收到该错误。[ <expression> ]不过,该语法足以满足您的需要,因此请将该行更改为以下内容:

if [ -f ~/.apache-was-up ]

答案2

我认为这就是您要找的(我更喜欢 /tmp,因为它在重启后会被删除,所以是一个全新的开始)。

#!/bin/sh
# Check if can fetch robots.txt if not then restart Apache and Varnish
# Send last few lines of logs with date via email

PATH=/bin:/usr/bin
THEDIR=/tmp/web-server-health
[email protected]
mkdir -p $THEDIR

if ( wget --timeout=30 -q -P $THEDIR http://website.com/robots.txt )
then
    # we are up
    touch /tmp/.apache-was-up
else
    # down! but if it was down already, don't keep spamming
    if [  -f /tmp/.apache-was-up ];
    then
        # write a nice e-mail
        echo -n "Web server down at " > $THEDIR/mail
        date >> $THEDIR/mail
        echo >> $THEDIR/mail
        echo "Apache Log:" >> $THEDIR/mail
        tail -n 30 /var/log/apache2/error.log >> $THEDIR/mail
        echo >> $THEDIR/mail
        echo "AUTH Log:" >> $THEDIR/mail
        tail -n 30 /var/log/auth.log >> $THEDIR/mail
        echo >> $THEDIR/mail
        # kick apache
        echo "Now kicking apache..." >> $THEDIR/mail
        /etc/init.d/varnish stop >> $THEDIR/mail 2>&1
        killall -9 varnishd >> $THEDIR/mail 2>&1
        /etc/init.d/varnish start >> $THEDIR/mail 2>&1
        /etc/init.d/apache2 stop >> $THEDIR/mail 2>&1
        killall -9 apache2 >> $THEDIR/mail 2>&1
        /etc/init.d/apache2 start >> $THEDIR/mail 2>&1
        # prepare the mail
        echo >> $THEDIR/mail
        echo "Good luck troubleshooting!" >> $THEDIR/mail
        # send the mail
        sendemail -o message-content-type=html -f [email protected] -t $EMAIL -u ALARM -m < $THEDIR/mail
        rm /tmp/.apache-was-up
    fi
fi

rm -rf $THEDIR

答案3

虽然该脚本可能有效,但仍存在一些问题,例如不安全地使用临时文件。

你真的应该看看监控,它是开源的,并且很容易编写规则,根据服务响应重新启动您的 Web 服务。它还可以检测正在运行的进程是否终止(例如其 PID 消失),并且您可以暂时停用检查(例如,当您正在进行服务维护时)。

答案4

这里有关于如何使用 Monit 监控 Varnish 并在其宕机时重新启动它的详细解答。

首先,访问http://www.tecmint.com/how-to-install-and-setup-monit-linux-process-and-services-monitoring-program/获取有关 Monit 的一些基本信息并进行安装。这是一个有用的教程,因为它提供了 RHEL/CentOS 和 Debian/Ubuntu 的默认路径。

二、参观https://www.computerminds.co.uk/articles/monitoring-varnish并按照有关设置 Varnish 监控的说明进行操作。

以下是我的设置中的一些注意事项:

  • 我建议使用 URL /varnish-ping 作为 VCL ping URL。这是一个容易记住的逻辑路径。设置完成后,您可以通过curl 127.0.0.1:80/varnish-ping从命令行运行并确保它返回 200 响应来测试它。
  • 确保您拥有正确的 Varnish pid。如第二篇文章所述,您可以在 init 脚本中找到它。我的实际上是 /var/run/varnish.pid。您可以执行 ls 以确保 Varnish 运行时该文件存在。
  • 您可能希望允许访问 Monit Web 界面以帮助进行监控。如果您有防火墙,则首先需要将端口 2812 添加到允许的端口。然后,根据以下条件更改允许访问的 IPhttp://digitizor.com/how-to-enable-monit-web-interface-from-all-ips-and-change-port/。您可以指定自己的远程 IP 而不是 0.0.0.0/8,以获得更高的安全性。请注意,密码是通过 HTTP Auth 传递的,因此您不应使用您希望特别安全的密码。
  • 确保 Monit 日志处于活动状态。检查“设置日志”日志以确保其中有类似内容set log /var/log/monit.log
  • 如果安装 Varnish 后它没有被添加到系统重启时启动的守护进程列表中,则必须通过 chkconfig(或 Ubuntu/Debian 等效程序)添加它。我运行它chkconfig --list以确认它存在。

希望这有助于提出更可靠的替代方案。请注意,您还可以通过 Monit 添加服务的电子邮件监控。以下是有关电子邮件警报的更多详细信息:https://fak3r.com/2010/04/10/howto-use-monit-to-monitor-sites-and-alert-users/

相关内容