Monit: Como monitorar otimamente um URL

6

Meu servidor da web executa nginx com php5-fpm. Se algum problema ocorrer, geralmente o php5-fpm é desligado, resultando em um erro no servidor "gateway inválido". Claro, eu nunca sei, se o nginx também falhar, algum dia.

Quando algo acontece, os dois processos (ad seus threads) geralmente existem e precisam ser reiniciados. Eu não estou muito interessado na causa de um problema atual, mas quero reiniciar ambos os processos. Para fazer isso, eu crio dois scripts bash /etc/monit/webserver.start.sh e /etc/monit/webserver.stop.sh.

Aqui está o meu arquivo de configuração monit (em 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"

Isso não é totalmente errado, mas algumas questões permanecem:

  1. Na verdade, não quero monitorar o processo nginx aqui, mas as portas / URLs. Posso usar qualquer outra verificação em vez de check process ?
  2. Para realizar diferentes ações após uma falha, 2 falhas e 4 falhas, preciso de três if failed condições, resultando em três solicitações do servidor. Existe alguma maneira de executar uma solicitação por ciclo e executar atividades diferentes após um número diferente de falhas?

Eu tentei encontrar as respostas da referência oficial monit, mas obviamente, eu não entendo as possibilidades como descrito nessa fonte. Portanto, gostaria de apprechiate alguns conselhos muito.

Atualizar

Depois de passar algum tempo com a man page do man (é muito melhor estruturado que o manual online, na minha opinião), eu encontrei essa otimização:

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"

Esta modificação não inclui o alerta na primeira falha de URL (uma solução alternativa seria usar comandos start / stop fictícios, aqui), mas pode reiniciar depois de 2 falhar e uma reinicialização aber 4 falhar - com apenas uma solicitação do servidor.

Ainda não é perfeito. Se alguém souber como fazê-lo melhor, o conselho ainda é apreciado :) Obrigado!

Atualizar

Após alguns testes, NÃO recomendo usar o recurso de tempo limite do monit ( IF 2 REsTARTS WITHIN... ) para ações de segunda ordem. Parece que a ação de timeout é executada novamente após uma reinicialização em determinadas circunstâncias. No meu caso, isso causou várias reinicializações:

[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

A menos que alguém tenha uma boa ideia, voltarei a várias solicitações. Finalmente, eles não são tão demorados ...

BurninLeo

    
por BurninLeo 17.12.2014 / 17:39

1 resposta

6

Eu não quero monitorar o processo nginx aqui, mas as portas / URLs. Posso usar qualquer outra verificação em vez de verificar o processo?

você pode usar a verificação de host, este é um exemplo do site monit:

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

Para realizar ações diferentes após 1 falha, 2 falha e 4 falha, preciso de três condições de falha, resultando em três solicitações do servidor. Existe alguma maneira de executar uma solicitação por ciclo e executar atividades diferentes após um número diferente de falhas?

O EXEC pode ser usado para executar um programa arbitrário e enviar um alerta. Se você escolher esta ação, você deve declarar o programa a ser executado e, se o programa exigir argumentos, você deve colocar o programa e seus argumentos em uma string entre aspas. Você pode, opcionalmente, especificar o uid e o gid que o programa executado deve alternar para após o início. Por exemplo:

exec "/usr/local/tomcat/bin/startup.sh"
    as uid nobody and gid nobody
    
por 22.12.2014 / 21:26