Como reinicio o nginx somente depois que o teste de configuração foi bem-sucedido no Ubuntu?

111

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.

jan
fonte
Que tal um pequeno script de shell que verifica o status de retorno de nginx -t (com $?) E depois reinicia dependendo do estado de retorno?
TeTeT

Respostas:

49

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.

Mohammad AbuShady
fonte
1
De qual versão do nginx você está falando? Estou trabalhando com a v 1.1.19 e ele tentará reiniciar independentemente de quaisquer erros nos arquivos de configuração. Ele me notificará de que há um problema, mas então já é tarde demais
janeiro
5
Ok, acabei de testar, meu laptop tem nginx 1.2 e funcionou como descrevi, meu VPS tem 1.1.19 como o seu e fez o mesmo que você descreveu em sua pergunta. Acho que isso foi resolvido em 1.2
Mohammad AbuShady,
Ótimo! Obrigado por descobrir isso para mim. Vou manter a pergunta aberta um pouco mais para ver se ninguém tem uma resposta para nginx <v1.2
jan
1
Acho que terei que fazer o upgrade então :-) De qualquer maneira, precisava de uma desculpa
janeiro
1
service nginx reloadnã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 restartirá parar o servidor se houver um erro na configuração!
Dan Dascalescu
80

A partir do nginx 1.8.0, a solução correta é

sudo nginx -t && sudo service nginx reload

Observe que devido a um bug, configtestsempre retorna um código de saída zero, mesmo se o arquivo de configuração tiver um erro.

Dan Dascalescu
fonte
3
nginx -t && sudo nginx -s reload
MechanisM
5
@MechanisM: nginx -tsem sudo, quase certamente falhará devido a erros de permissão.
Dan Dascalescu
Eu queria mostrar principalmente a última parte para recarregar. No meu caso, eu compilei o nginx de maneira personalizada e nem mesmo tenho scripts em /etc/init.d e assim por diante, então no meu caso "service nginx reload" não fará nada
MechanisM
39

Eu uso o seguinte comando para recarregar o Nginx (versão 1.5.9) apenas se um teste de configuração for bem-sucedido:

/etc/init.d/nginx configtest && sudo /etc/init.d/nginx reload

Se você precisa fazer isso com freqüência, pode usar um alias. Eu uso o seguinte:

alias n='/etc/init.d/nginx configtest && sudo /etc/init.d/nginx reload'

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.

Mauricio Sánchez
fonte
Cuidado com o nginx 1.4.2 que descobri 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.
KCD de
2
Isso não funciona para mim. Ambos os comandos são executados mesmo se o teste falhar.
Mario Campa
2
configtest sempre retorna um código de saída zero , pelo menos no nginx 1.8.0. Use em seu nginx -tlugar.
Dan Dascalescu
8
alias nginx.start='sudo nginx -c /etc/nginx/nginx.conf'
alias nginx.stop='sudo nginx -s stop'
alias nginx.reload='sudo nginx -s reload'
alias nginx.config='sudo nginx -t'
alias nginx.restart='nginx.config && nginx.stop && nginx.start'
alias nginx.errors='tail -250f /var/logs/nginx.error.log'
alias nginx.access='tail -250f /var/logs/nginx.access.log'
alias nginx.logs.default.access='tail -250f /var/logs/nginx.default.access.log'
alias nginx.logs.default-ssl.access='tail -250f /var/logs/nginx.default.ssl.log'

e depois use os comandos "nginx.reload" etc.

Mecanismo
fonte
6

Você pode recarregar usando /etc/init.d/nginx reloadesudo service nginx reload

Se nginx -tlançar algum erro, ele não recarregará

então use && para executar ambos ao mesmo tempo

gostar

nginx -t && /etc/init.d/nginx reload

gokul kandasamy
fonte
Deixe-me te ensinar algo sobre bash. && não 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 -tlançar um erro, seu código de saída não será 0, então o segundo comando não será executado. De nginx -s reloadqualquer forma
Miknik
@miknik Acho que é isso que ele quis dizer, simplesmente não saiu direito. Ele diz If nginx -t throws some error then it won't reload. A declaração run both at a same timetambém pode ser interpretada como um único comando ou uma linha. Eu não o interpreto necessariamente dizendo neste caso in parallel.
matt
2

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.

HUP - alterar a configuração, manter o fuso horário alterado (apenas para FreeBSD e Linux), iniciar novos processos de trabalho com uma nova configuração, desligamento normal de processos de trabalho antigos

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:

kill -HUP $( cat /var/run/nginx.pid )

O comando acima lê o PID nginx de /var/run/nginx.pid. Por padrão, o nginx pid é gravado, /usr/local/nginx/logs/nginx.pidmas pode ser sobrescrito na configuração. Verifique seu nginx.configpara ver onde ele salva o PID.

hcristea
fonte
1

Pelo menos no Debian, o script de inicialização nginx tem uma função reload que faz:

reload)
  log_daemon_msg "Reloading $DESC configuration" "$NAME"
  test_nginx_config
  start-stop-daemon --stop --signal HUP --quiet --pidfile $PID \
   --oknodo --exec $DAEMON
  log_end_msg $?
  ;;

Parece que tudo que você precisa fazer é ligar em service nginx reloadvez de, restartpois ele chama test_nginx_config.

Daenney
fonte
service nginx reloadnão dará qualquer tipo de indicação se a configuração testada OK ou não, ou se foi recarregada ou não.
Dan Dascalescu
O que test_nginx_configfazer então nesse caso?
Daenney
1
Eu acho que vocês dois têm razão. 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 -tdiria qual arquivo tinha o parâmetro inválido e em qual linha.
anastymous