Garantir que um processo esteja sempre em execução

23

Comecei a hospedar sites há algum tempo usando o Cherokee. Para fontes externas (FastCGI, etc), há uma opção para iniciar o processo se não encontrar uma em execução no soquete ou porta designada. Isso é ótimo porque significa que se o PHP ou um site Django cair (como ocasionalmente acontece), ele será reiniciado automaticamente.

Em um novo servidor usando PHP-FPM, eu não poderia usar o Cherokee (ele possui um bug no PHP), então mudei para o NGINX. Eu realmente gosto do NGINX (por seu estilo de configuração), mas estou tendo sérios problemas com processos em queda e nunca reaparecendo. O PHP faz isso algumas vezes, mas os sites Django são mais um problema. Eu criei scripts init para eles e eles aparecem na inicialização, mas isso não me ajuda se eles aparecerem entre as reinicializações.

Acho que estou procurando um proxy FastCGI. Algo que, como o Cherokee, sabe quais processos devem estar em execução em quais soquetes / portas e os repassa sob demanda. Será que tal coisa existe? Existe alguma maneira de criar isso no NGINX (para facilitar a configuração)?

Oli
fonte

Respostas:

13

Que tal daemontools e, especificamente, a ferramenta de supervisão

supervisionar monitora um serviço. Inicia o serviço e reinicia o serviço se morrer. A configuração de um novo serviço é fácil: todas as necessidades de supervisão são um diretório com um script de execução que executa o serviço.

Murilo
fonte
+1 para daemontools. No entanto, muitas vezes você não pode simplesmente lançar um script como /etc/init.d/apachectlesse. Você geralmente precisa reescrever seu próprio script de inicialização simples para usar exec. Embora eu gostaria de ver mais alguns exemplos usando daemontools
Stefan Lasiewski
daemontools tem outra encarnação como runit. Não é tão importante agora que daemontools é de domínio público, mas uma distribuição mais antiga pode ter apenas runit.
Camh
8

reaparecer em inittab

Stephen Jazdzewski
fonte
5

Eu apóio a daemontoolssugestão, mas se você não gosta do modo como o software da DJB funciona (por qualquer motivo), também existe supervisord.

Eu configurei uma imagem do FreeBSD há algum tempo que costumava supervisordgerenciar nginxe gunicorn, que eu costumava hospedar alguns aplicativos WSGI simples, e todo o processo era bem direto.

Se você está fazendo isso no Django, o Gunicorn torna realmente simples a implantação de aplicativos Django. Veja esta postagem no blog para mais detalhes.

Hank Gay
fonte
4

Outra opção pode ser usar o monit , que é o que geralmente uso.


fonte
3

Você já considerou god?

Deus é uma estrutura de monitoramento fácil de configurar, fácil de estender, escrita em Ruby.

Manter os processos e tarefas do servidor em execução deve ser uma parte simples do processo de implantação. Deus pretende ser o aplicativo de monitoramento mais simples e poderoso disponível.

Eu o uso para garantir que, se as instâncias Rails / nginx caírem, elas sejam revividas e, embora eu não tenha suporte interno para verificar se está usando a porta correta ou não, mas se o problema é que o processo falha ou não está mais em execução, você não pode dar errado god.

Chris Bunch
fonte
0

Uma solução hackish seria lançar periodicamente um script (via cron) que detecsse se o processo estivesse inoperante e, nesse caso, reiniciá-lo.

Robert Swisher
fonte
0

Existem várias maneiras de reiniciar um daemon com falha. A recomendação usual é "reaparecer no inittab", mas com alguma consideração de um limite se a máquina estiver realmente parafusada.

O daemon watchdog também pode monitorar um processo através de seu arquivo PID. No entanto, isso deve ser considerado apenas como uma linha de defesa secundária para reiniciar uma máquina que está muito doente para funcionar corretamente (por exemplo, falta de memória, bombardeio de garfo, etc.), e não como uma maneira primária ou de monitorar e reiniciar um daemon.

Finalmente, você pode considerar o monitoramento de sistemas complexos usando o nagios para fornecer aos administradores uma visão global. Ele pode executar plug-ins para analisar a operação do daemon externamente, que é um teste mais completo de seu funcionamento que simplesmente o PID ativo.

Paul Crawford
fonte
-1

Resposta simples - comece, escreva seu pid em algum lugar e cada vez que x (segundos, minutos, sua aposta) verifique se o processo está encerrado.

Resposta longa - todos os itens acima são bons métodos. Mas um pouco complicado.

Lembre-se também de que estar vivo e responder a solicitações são coisas diferentes.

lucabotti
fonte
1
... e cruze os dedos e espere que nada rabisque o arquivo PID, apague-o ou reutilize-o para um daemon diferente, ou aponte-o para outro processo inocente e não relacionado que não reaja bem à verificação por estar acordado. ☺ É por isso que a resposta longa de um supervisor de daemon adequado que executa daemons como processos filhos e os monitora com os mecanismos usuais do sistema Unix / Linux é a maneira melhor aceita há muito tempo.
JdeBP