Quando eu reinicio o serviço nginx em uma linha de comando em um servidor Ubuntu, o serviço falha quando um arquivo de configuração nginx tem erros. Em um servidor de vários sites, isso coloca todos os sites no ar, mesmo aqueles sem erros de configuração.
Para evitar isso, eu executo o teste de configuração do nginx primeiro:
nginx -t
Depois que o teste foi executado com sucesso, eu poderia reiniciar o serviço:
/etc/init.d/nginx restart
Ou apenas recarregue as configurações do site nignx sem reiniciar:
nginx -s reload
Existe uma maneira de combinar esses dois comandos em que o comando de reinicialização é condicional ao resultado do teste de configuração?
Não consegui encontrar isso online e a documentação oficial sobre isso é bastante básica. Não conheço muito bem o Linux, então não sei se o que procuro está bem na minha frente ou se não é possível.
Estou usando o nginx v1.1.19.
fonte
Respostas:
Na verdade, até onde eu sei, o nginx mostraria uma mensagem vazia e não reiniciaria se a configuração fosse ruim.
A única maneira de estragar tudo é fazer uma parada do nginx e começar de novo. Teria sucesso em parar, mas não conseguiria começar.
fonte
service nginx reload
não mostra nada se a configuração foi carregada corretamente ou não, portanto, é inútil se você suspeitar que a configuração pode estar incorreta.service nginx restart
irá parar o servidor se houver um erro na configuração!A partir do nginx 1.8.0, a solução correta é
Observe que devido a um bug,
configtest
sempre retorna um código de saída zero, mesmo se o arquivo de configuração tiver um erro.fonte
nginx -t
sem sudo, quase certamente falhará devido a erros de permissão.Eu uso o seguinte comando para recarregar o Nginx (versão 1.5.9) apenas se um teste de configuração for bem-sucedido:
Se você precisa fazer isso com freqüência, pode usar um alias. Eu uso o seguinte:
O truque aqui é feito pelo "&&" que só executa o segundo comando se o primeiro for bem-sucedido. Você pode ver aqui uma explicação mais detalhada sobre o uso do operador "&&".
Você pode usar "reiniciar" em vez de "recarregar" se realmente quiser reiniciar o servidor.
fonte
pkill -1 nginx
(efetivamente o que meu reload init.d / nginx faz) NÃO recarrega se a configuração falhar e retornar erroneamente com êxito. Verifique suas próprias versões.nginx -t
lugar.e depois use os comandos "nginx.reload" etc.
fonte
Você pode recarregar usando
/etc/init.d/nginx reload
esudo service nginx reload
Se
nginx -t
lançar algum erro, ele não recarregaráentão use && para executar ambos ao mesmo tempo
gostar
fonte
run both at a same time
. Executa o comando à direita SE o comando à esquerda retorna um código de saída 0. Se vocênginx -t
lançar um erro, seu código de saída não será 0, então o segundo comando não será executado. Denginx -s reload
qualquer formaIf nginx -t throws some error then it won't reload
. A declaraçãorun both at a same time
também pode ser interpretada como um único comando ou uma linha. Eu não o interpreto necessariamente dizendo neste casoin parallel
.Você pode usar sinais para controlar o nginx.
De acordo com a documentação, você precisa enviar o sinal HUP para o processo mestre nginx.
Verifique a documentação aqui: http://nginx.org/en/docs/control.html
Você pode enviar o sinal HUP para o PID do processo mestre nginx assim:
O comando acima lê o PID nginx de
/var/run/nginx.pid
. Por padrão, o nginx pid é gravado,/usr/local/nginx/logs/nginx.pid
mas pode ser sobrescrito na configuração. Verifique seunginx.config
para ver onde ele salva o PID.fonte
Pelo menos no Debian, o script de inicialização nginx tem uma função reload que faz:
Parece que tudo que você precisa fazer é ligar em
service nginx reload
vez de,restart
pois ele chamatest_nginx_config
.fonte
service nginx reload
não dará qualquer tipo de indicação se a configuração testada OK ou não, ou se foi recarregada ou não.test_nginx_config
fazer então nesse caso?service nginx reload
é suficiente na linha de comando, porém às vezes você pode querer capturar a saída stderr e retorná-la a um script para solução de problemas.nginx -t
diria qual arquivo tinha o parâmetro inválido e em qual linha.