Очень плохо, когда сайт падает. Гораздо хуже, когда он падает по непонятной причине. Иногда на установление причины сбоя может понадобиться продолжительное время, если все это время сайт будет «лежать» админа могут просто уволить. К счастью, есть решение, позволяющее немного скрасить «горечь падения» и оно будет описано в этой статье.
Автор этой статьи на своей практике столкнулся с нестабильной работой сайта (виртуальный
Суть решения в следующем: нужно настроить/написать самому средство мониторинга работоспособности сайта. Если сайт «упал», это средство будет перезапускать сервисы Apache и MySQL (или только Apache — все зависит от специфики сайта и причины сбоя).
Решение, конечно же, временное. Нужно найти и устранить причину падения, но зато такой «костыль» позволяет быстро восстановить работоспособность сайта: руководство даже не заметит сбой. Что же касается обычных пользователей, то даже если
Проверять работоспособность сайта можно двумя способами: или пытаться получить реальный файл (можно для этого создать пустой файл в корне, важно получить
Проще всего проверить работоспособность
#!/bin/bash if curl -s --head --request GET http://site.name | grep "200 OK" > /dev/null; then echo "Site is UP" else echo "site is DOWN, restarting Apache" /usr/sbin/service apache2 restart fi
Вызов сценария нужно поместить в расписание cron. Периодичность зависит от частоты падения сервера — если сервер сбоит иногда, можно раз в 5–10 минут, если сайт «лежит» часто — раз в минуту. Да, это создаст дополнительную нагрузку на сервер, но зато обеспечит его перезапуск в течение одной минуты.
Напишем небольшой
Затем создается
#!/bin/bash RESULT=$(/usr/bin/php test-mysql.php) if [ $RESULT -eq 0 ]; then echo «Restarting MySQL» /etc/init.d/mysqld restart fi
Как и в случае с первым нашим
Если процессы не виснут, а «падают», то есть после сбоя вообще нет процессов Apache/MySQL в. таблице процессов, тогда поможет следующий сценарий:
#!/bin/bash RESTART="/etc/init.d/apache2 restart" PGREP="/usr/bin/pgrep" HTTPD="apache2" $PGREP ${HTTPD} if [ $? -ne 0 ]; then $RESTART date >> /var/log/srvmon.log echo "Apache restarted" >> /var/log/srvmon.log fi RESTARTM="/etc/init.d/mysql restart" MYSQLD="mysqld" $PGREP ${MYSQLD} if [ $? -ne 0 ]; then $RESTART $RESTARTM date >> /var/log/srvmon.log echo "Services restarted" > /var/log/srvmon.log fi
Он не только перезапускает «упавшие» сервисы, но и ведет небольшой лог — записывает время, когда сервисы были перезапущены.
Все приведенное ранее можно сделать и с помощью сервиса monit. Его задача — мониторинг работоспособности сервера. Если
В Интернете есть множество статей, посвященных monit, к тому же у него очень хорошая документация. Поэтому не хочется плагиатить — ничего нового на тему monit уже не напишешь. Вместо этого приведу реальный конфиг мониторинга Apache с одного из администрируемых автором этой статьи серверов:
check process apache with pidfile /var/run/apache2.pid group www group apache start program = "/etc/init.d/apache2 start" stop program = "/etc/init.d/apache2 stop" # если загрузка cpu > 90% 5 циклов то перезапустить процесс. if cpu > 90% for 5 cycles then restart # если не удается получить файл server-status, перезапустить if failed host localhost port 80 with protocol http and request "/server-status" with timeout 25 seconds for 4 times within 5 cycles then restart depend apache_bin depend apache_rc check file apache_bin with path /usr/sbin/apache2 group apache include /etc/monit/templates/rootbin check file apache_rc with path /etc/init.d/apache2 group apache include /etc/monit/templates/rootbin
Конфигурация monit, думаю, понятна даже новичку. На конкретном сервере была проблема с большой загрузкой процессора, после пика загрузки сервер падал. Поэтому было добавлено две проверки: если загрузка процессора выше 90%, сервис перезапускался и если сервер уже упал (не удается получить файл), то сервис тоже перезапускался.