На моем веб-сервере работает nginx с php5-fpm. Если возникают какие-то проблемы, обычно php5-fpm зависает, что приводит к ошибке сервера «плохой шлюз». Конечно, я никогда не знаю, может ли когда-нибудь вылететь и nginx.
Когда что-то происходит, оба процесса (и их потоки) обычно существуют и нуждаются в перезапуске. Меня не так сильно интересует причина текущей проблемы, но я хочу перезапустить оба процесса. Для этого я создаю два сценария bash /etc/monit/webserver.start.sh и /etc/monit/webserver.stop.sh.
Вот мой файл конфигурации монитора (в conf.d):
check process webserver with pidfile /var/run/nginx.pid
start program = "/etc/monit/webserver.start.sh"
stop program = "/etc/monit/webserver.stop.sh"
if failed (url https://www.myserver.com/example/ and content == 'test string' and timeout 20 seconds)
then alert
if failed (url https://www.myserver.com/example/ and content == 'test string' and timeout 20 seconds)
for 2 cycles
then restart
if failed (url https://www.myserver.com/example/ and content == 'test string' and timeout 20 seconds)
for 4 cycles
then exec "/sbin/reboot"
Это не совсем так, но остаются вопросы:
nginx
процесс здесь, но порты / URL-адреса. Могу ли я использовать любой другой чек вместо check process
?if failed
условия, в результате чего три запроса к серверу. Есть ли способ запускать один запрос за цикл и выполнять разные действия после другого количества сбоев?Я попытался найти ответы в официальной ссылке на monit, но, очевидно, я не понимаю возможностей, описанных в этом источнике. Поэтому я был бы очень благодарен за некоторые советы.
Обновить
Проведя некоторое время с man-страницей monit (на мой взгляд, она намного лучше структурирована, чем онлайн-руководство), я нашел такую оптимизацию:
CHECK HOST webserver WITH ADDRESS 127.0.0.1
START PROGRAM = "/etc/monit/webserver.start.sh"
STOP PROGRAM = "/etc/monit/webserver.stop.sh"
IF NOT EXIST THEN ALERT
IF FAILED (url https://www.mydomain.tld/example/ and content == 'test content' and timeout 20 seconds)
FOR 2 CYCLES
THEN RESTART
IF 2 RESTARTS WITHIN 5 CYCLES
THEN EXEC "/sbin/reboot"
Эта модификация не включает предупреждение о первом сбое URL-адреса (здесь можно было бы использовать фиктивные команды запуска / остановки), но можно выполнить перезапуск после 2 сбоев и 4 сбоя перезагрузки - только с одним запросом сервера.
Это все еще не идеально. Если кто-то знает, как это сделать лучше, совет все еще приветствуется :) Спасибо!
Обновить
После некоторого тестирования я НЕ рекомендую использовать функцию тайм-аута monit (IF 2 REsTARTS WITHIN...
) для действий второго порядка. Кажется, что действие тайм-аута повторно запускается после перезагрузки при определенных обстоятельствах. В моем случае это вызвало несколько перезагрузок:
[CET Dec 28 05:59:50] error : skipping queued event /var/monit/id - unknown data format
[CET Dec 28 05:59:50] error : skipping queued event /var/monit/state - unknown data format
[CET Dec 30 03:10:52] error : 'webserver' failed protocol test [HTTP] at INET[www.myserver.com/example/] via TCPSSL -- HTTP: Error receiving data -- Resource temporarily unavailable
[CET Jan 1 03:08:10] error : 'webserver' failed protocol test [HTTP] at INET[www.myserver.com/example/] via TCPSSL -- HTTP: Error receiving data -- Resource temporarily unavailable
[CET Jan 1 03:09:30] error : 'webserver' failed protocol test [HTTP] at INET[www.myserver.com/example/] via TCPSSL -- HTTP: Error receiving data -- Resource temporarily unavailable
[CET Jan 1 03:09:31] info : 'webserver' trying to restart
[CET Jan 1 03:09:31] info : 'webserver' stop: /etc/monit/webserver.stop.sh
[CET Jan 1 03:09:31] info : 'webserver' start: /etc/monit/webserver.start.sh
[CET Jan 1 03:10:31] error : 'webserver' failed, cannot open a connection to INET[www.myserver.com/example/] via TCPSSL
[CET Jan 1 03:10:31] info : 'webserver' trying to restart
[CET Jan 1 03:10:31] info : 'webserver' stop: /etc/monit/webserver.stop.sh
[CET Jan 1 03:10:31] info : 'webserver' start: /etc/monit/webserver.start.sh
[CET Jan 1 03:10:31] error : 'php-fpm' process is not running
[CET Jan 1 03:10:31] info : 'php-fpm' trying to restart
[CET Jan 1 03:10:31] info : 'php-fpm' start: /usr/sbin/service
[CET Jan 1 03:10:31] error : 'nginx' process is not running
[CET Jan 1 03:10:31] info : 'nginx' trying to restart
[CET Jan 1 03:10:31] info : 'nginx' start: /usr/sbin/service
[CET Jan 1 03:11:32] error : 'webserver' service restarted 2 times within 2 cycles(s) - exec
[CET Jan 1 03:11:32] info : 'webserver' exec: /sbin/reboot
[CET Jan 1 03:12:24] info : Starting monit daemon with http interface at [0.0.0.0:2812]
[CET Jan 1 03:12:24] info : Monit start delay set -- pause for 240s
[CET Jan 1 03:16:24] info : Starting monit HTTP server at [0.0.0.0:2812]
[CET Jan 1 03:16:24] info : monit HTTP server started
[CET Jan 1 03:16:24] info : 'Memory' Monit started
[CET Jan 1 03:16:24] error : skipping queued event /var/monit/id - unknown data format
[CET Jan 1 03:16:24] error : skipping queued event /var/monit/state - unknown data format
[CET Jan 1 03:16:24] error : 'webserver' service restarted 2 times within 2 cycles(s) - exec
[CET Jan 1 03:16:24] info : 'webserver' exec: /sbin/reboot
[CET Jan 1 03:17:04] info : Starting monit daemon with http interface at [0.0.0.0:2812]
[CET Jan 1 03:17:04] info : Monit start delay set -- pause for 240s
[CET Jan 1 03:21:04] info : Starting monit HTTP server at [0.0.0.0:2812]
[CET Jan 1 03:21:04] info : monit HTTP server started
[CET Jan 1 03:21:04] info : 'Memory' Monit started
[CET Jan 1 03:21:04] error : skipping queued event /var/monit/id - unknown data format
[CET Jan 1 03:21:04] error : skipping queued event /var/monit/state - unknown data format
[CET Jan 1 03:21:04] error : 'webserver' service restarted 2 times within 2 cycles(s) - exec
[CET Jan 1 03:21:04] info : 'webserver' exec: /sbin/reboot
[CET Jan 1 03:21:44] info : Starting monit daemon with http interface at [0.0.0.0:2812]
[CET Jan 1 03:21:44] info : Monit start delay set -- pause for 240s
[CET Jan 1 03:25:44] info : Starting monit HTTP server at [0.0.0.0:2812]
[CET Jan 1 03:25:44] info : monit HTTP server started
[CET Jan 1 03:25:44] info : 'Memory' Monit started
[CET Jan 1 03:25:44] error : skipping queued event /var/monit/id - unknown data format
[CET Jan 1 03:25:44] error : skipping queued event /var/monit/state - unknown data format
[CET Jan 1 03:25:44] error : 'webserver' service restarted 2 times within 2 cycles(s) - exec
[CET Jan 1 03:25:44] info : 'webserver' exec: /sbin/reboot
Если у кого-то нет хорошей идеи, я вернусь к нескольким запросам. Наконец, они не так трудоемки ...
BurninLeo
Я не хочу отслеживать здесь процесс nginx, а только порты / URL-адреса. Могу ли я использовать любую другую проверку вместо проверки?
вы можете использовать проверку хоста, это пример с сайта мониторинга:
check host mmonit.com with address mmonit.com
if failed
port 80 protocol http
with http headers [Host: mmonit.com, Cache-Control: no-cache, Cookie: csrftoken=nj1bI3CnMCaiNv4beqo8ZaCfAQQvpgLH]
and request /monit/ with content = "Monit [0-9.]+"
then alert
Чтобы выполнять различные действия после 1 сбоя, 2 сбоев и 4 сбоев, мне нужно три условия в случае сбоя, что приводит к трем запросам сервера. Есть ли способ запускать один запрос за цикл и выполнять разные действия после другого количества сбоев?
EXEC можно использовать для выполнения произвольной программы и отправки предупреждения. Если вы выбираете это действие, вы должны указать программу, которая будет выполняться, и если программе требуются аргументы, вы должны заключить программу и ее аргументы в строку в кавычки. При желании вы можете указать uid и gid, на которые исполняемая программа должна переключаться при запуске. Например:
exec "/usr/local/tomcat/bin/startup.sh"
as uid nobody and gid nobody