Назад | Перейти на главную страницу

Как я могу автоматически перезапустить Apache и Varnish, если не могу получить файл?

Мне нужно перезапустить Apache и Varnish и отправить несколько журналов по электронной почте, если скрипт не может получить файл robots.txt, но я получаю сообщение об ошибке.

./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=dude@email.net
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 alerts@website.net -t $EMAIL -u ALARM -m < $THEDIR/mail
        rm ~/.apache-was-up
    fi
fi

rm -rf $THEDIR

Хотя сценарий может работать, с ним связаны некоторые проблемы, например небезопасное использование временных файлов.

Вам действительно стоит взглянуть на Монит, это открытый исходный код, и легко написать правило, которое перезапускает ваши веб-службы на основе ответов службы. Он также может определять, умирает ли запущенный процесс (например, его PID уходит), и у вас есть возможность временно отключить проверку (например, когда вы выполняете сервисное обслуживание).

Я думаю, что это то, что вы ищете (я предпочитаю / 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=dude@email.net
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 alerts@website.net -t $EMAIL -u ALARM -m < $THEDIR/mail
        rm /tmp/.apache-was-up
    fi
fi

rm -rf $THEDIR
if [[ -f ~/.apache-was-up ]]

В Ubuntu /bin/sh символическая ссылка на рывок вместо того трепать. dash - это минимальная оболочка, разработанная для сценариев, тогда как bash более функциональна и предназначена для интерактивного использования. В [[ <expression> ]] синтаксис реализован только в bash, а не в тире, поэтому вы получаете эту ошибку. В [ <expression> ] Синтаксиса достаточно для того, что вам нужно, поэтому измените эту строку на эту:

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

Вот подробный ответ о том, как использовать 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 для URL-адреса VCL ping. Это логичный путь, который легко запомнить. Вы можете проверить это после настройки, запустив curl 127.0.0.1:80/varnish-ping из командной строки и убедитесь, что он возвращает ответ 200.
  • Убедитесь, что у вас правильный лак. Как сказано во второй статье, вы можете найти это в сценарии инициализации. Мой на самом деле был /var/run/varnish.pid. Вы можете выполнить команду ls, чтобы убедиться, что файл существует во время работы Varnish.
  • Возможно, вы захотите разрешить доступ к веб-интерфейсу Monit, чтобы помочь в мониторинге. Если у вас есть брандмауэр, вам сначала нужно добавить порт 2812 к разрешенным портам. Затем измените, к каким IP-адресам разрешен доступ в соответствии с http://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", чтобы убедиться, что в нем есть что-то вроде 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/