Eu uso o nginx como um proxy reverso. Sempre que eu atualizo a configuração para ele usando
sudo "cp -r #{nginx_config_path}* /etc/nginx/sites-enabled/"
sudo "kill -s HUP `cat /var/run/nginx.pid`"
Enfrento um breve tempo de inatividade. Como posso evitar isso?
Executar
service nginx reload
ou/etc/init.d/nginx reload
Ele fará uma recarga a quente da configuração sem tempo de inatividade. Se você tiver solicitações pendentes, haverá processos nginx remanescentes que lidarão com essas conexões antes que elas morram, por isso é uma maneira extremamente elegante de recarregar as configurações.
Às vezes você pode querer preceder com
sudo
Corre
/usr/sbin/nginx -s reload
Consulte http://wiki.nginx.org/CommandLine para obter mais opções de linha de comando.
Não, você está incorreto, você não deveria estar enfrentando nenhum tempo de inatividade com o procedimento que você descreve. (O Nginx pode não apenas recarregar a configuração dinamicamente sem nenhum tempo de inatividade, mas até mesmo a atualização do executável dinamicamente, ainda sem nenhum tempo de inatividade.)
De acordo com http://nginx.org/docs/control.html#reconfiguration , enviar o
HUP
sinal para nginx garante que ele execute uma reinicialização normal e, se os arquivos de configuração estiverem incorretos, todo o procedimento será abandonado e você ' é deixado com o nginx como antes de enviar oHUP
sinal. Em nenhum momento deve ser possível qualquer tempo de inatividade.Nginx e Sinais
A
kill
abordagem que você usou (kill -s HUP $(cat /var/run/nginx.pid
) está correta. Scripts de inicialização para distribuições RH ou Debian também são implementados usandokill
o comando. Você pode verificar o exemplo do Init no site nginx ou no conteúdo do pacote Ubuntu Nginx .Existem vários sinais que o nginx pode ouvir ( mencionado no wiki ):
TERM
,INT
- Desligamento rápido.QUIT
- Desligamento gracioso.KILL
- Interrompe um processo teimoso.HUP
- Recarregamento de configuração. Inicie os novos processos de trabalho com uma nova configuração. Desligue graciosamente os antigos processos de trabalho.USR1
- Reabra os arquivos de log.USR2
- Atualize o executável em tempo real.WINCH
- Desligue graciosamente os processos de trabalho.Recarregar Nginx
Nginx reload (
HUP
sinal) é implementado mais especificamente como várias etapas [1,2]:Apenas um problema em que consigo pensar por que você teve tempo de inatividade (com base no processo de recarga) é que você estava usando apenas um processo de trabalho (
worker_processes
diretiva), que por design estava atendendo clientes antigos, mas tinha um soquete de escuta fechado, portanto, você não podia abra uma nova conexão.Também posso recomendar que você sempre use
/usr/sbin/nginx -t
para validar os arquivos de configuração antes de aplicar a nova configuração.Nginx Reload em profundidade
O sinal de reconfiguração é tratado no arquivo
ngx_process_cycle.c
e podemos ver que ele inicia novos processos de trabalho em functionngx_start_worker_processes(...)
e, no final, interrompe processos de trabalho antigos em functionngx_signal_worker_processes(...)
, que itera sobre eles comNGX_SHUTDOWN_SIGNAL
signal.Recursos:
Para completar, a
systemd
maneira de fazê-lo:Normalmente, recarregar o arquivo de configuração de um serviço não deve afetar o serviço em execução. No entanto, isso depende de como o
SIGHUP
sinal é processado.Se um serviço específico estiver passando por um tempo de inatividade durante o recarregamento, isso pode ser contornado executando o mesmo serviço em vários servidores, de preferência usando um balanceador de carga. Nesse caso, você pode remover um servidor de cada vez e recarregá-lo/reiniciá-lo. Então, ele pode ser adicionado novamente após a confirmação de que está OK.