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

Monit: как оптимально отслеживать URL

На моем веб-сервере работает 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"

Это не совсем так, но остаются вопросы:

  1. Собственно, я не хочу контролировать nginx процесс здесь, но порты / URL-адреса. Могу ли я использовать любой другой чек вместо check process?
  2. Чтобы выполнять разные действия после 1 сбоя, 2 сбоев и 4 сбоев, мне нужно три 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