29
loading...
This website collects cookies to deliver better user experience
protected function listenSignals(): void
{
defined('AMQP_WITHOUT_SIGNALS') ?: define('AMQP_WITHOUT_SIGNALS', false);
pcntl_async_signals(true);
pcntl_signal(SIGTERM, [$this, 'signalHandler']);
pcntl_signal(SIGINT, [$this, 'signalHandler']);
pcntl_signal(SIGQUIT, [$this, 'signalHandler']);
}
public function signalHandler($signalNumber)
{
switch ($signalNumber) {
case SIGTERM: // 15 : supervisor default stop
$this->quitHard();
break;
case SIGQUIT: // 3 : kill -s QUIT
$this->quitHard();
break;
case SIGINT: // 2 : ctrl+c
$this->quit();
break;
}
}
quit()
e quitHard()
que têm como objetivo fechar a conexão com o RabbitMQ. Até agora falamos muito sobre esses sinais que os processos podem receber de outro processos, ou até mesmo do kernel, mas caso você não estaja familiarizado ou se não souber exatamente a diferença entre eles, você pode ficar um pouco mais por dentro nesse artigo.FROM nginx:latest
ENTRYPOINT ["nginx", "-g", "daemon off;"]
ENTRYPOINT
no formato de array, se você entrar dentro do container gerado por esse Dockerfie e executar o comando pstree
verá o seguinte output:docker stop
no container em execução e provavelmente veremos o container sendo desligado quase instantaneamente.FROM nginx:latest
ENTRYPOINT nginx -g 'daemon off;'
ENTRYPOINT
o comando em questão é executato pelo shell dentro do container, segue o output do pstree
:sh
, ele quem receberá os sinais de desligamento e por acaso não sabe muito bem o que fazer com esses sinais, se você executar um docker stop
nesse container verá que demora 10 segundos para parar, dessa forma não faremos o "Graceful Shutdown" e nunca teremos um verdadeiro deploy "Zero Down Time" porque sempre que o container com a versão antiga do código morrer, vai levar os requests que estão em execução para a vala junto. Logo devemos nos assegurar que nosso processo está recebendo o sinal de desligamento corretamente.502
durante o deploy. Isso acontece porque durante o deploy um novo container é criado e o supervisord simplesmente não sabe qual processo deve iniciar primeiro, se por acaso o nginx estiver pronto para receber um request, mas o php-fpm ainda não foi corretamente iniciado então temos um 502
. Resolver esse problema de prioridade entre os processos é relativamente simples, o supervisord tem uma flag priority que tem o proposito de dizer quem é o processo de maior prioridade, entre outras palavras esse processo deve ser criado primeiro e morrer por último, a seguir segue uma configuração real de uma aplicação da Convenia em produção:[supervisord]
nodaemon=true
[program:nginx]
command = nginx -c /etc/nginx/nginx.conf -g 'daemon off;'
user = app
autostart = true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
redirect_stderr=true
[program:php-fpm]
command = /usr/sbin/php-fpm7 -F
priority = 1
user = app
autostart = true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
redirect_stderr=true
priority = 1
, essa configuração vai instruir o supervisord a criar o php-fpm primeiro e a desligar ele por último, agora sim temos um deploy perfeito, sem downtime.