Come faccio a riavviare nginx solo dopo che il test di configurazione ha avuto esito positivo su Ubuntu?


111

Quando riavvio il servizio nginx su una riga di comando su un server Ubuntu, il servizio si arresta in modo anomalo quando un file di configurazione nginx presenta errori. Su un server multi-sito questo mette giù tutti i siti, anche quelli senza errori di configurazione.

Per evitare ciò, eseguo prima il test di configurazione di nginx:

nginx -t

Dopo che il test ha avuto esito positivo, potrei riavviare il servizio:

/etc/init.d/nginx restart

O solo ricaricare le configurazioni del sito nignx senza un riavvio:

nginx -s reload

C'è un modo per combinare questi due comandi in cui il comando di riavvio è condizionato al risultato del test di configurazione?

Non sono riuscito a trovarlo online e la documentazione ufficiale su questo è piuttosto semplice. Non conosco molto bene Linux, quindi non so se quello che sto cercando è giusto di fronte a me o non è affatto possibile.

Sto usando nginx v1.1.19.


Che ne dici di un piccolo script di shell che controlla lo stato di ritorno di nginx -t (con $?) E quindi fa il riavvio a seconda dello stato di ritorno?
TeTeT

Risposte:


49

In realtà, per quanto ne so, nginx mostrerebbe un messaggio vuoto e non si riavvierebbe effettivamente se la configurazione è cattiva.

L'unico modo per rovinare tutto è fare uno stop nginx e poi ricominciare. Riuscirebbe a fermarsi, ma non a partire.


1
Di quale versione di nginx stai parlando? Sto lavorando con la v 1.1.19 e proverò a riavviarsi indipendentemente da eventuali errori nei file di configurazione. Mi avviserà che c'è un problema, ma a quel punto è già troppo tardi
gennaio

5
Ok l'ho appena testato, il mio laptop ha nginx 1.2 e ha funzionato come ho descritto, il mio VPS ha 1.1.19 come il tuo, e ha fatto lo stesso come hai descritto nella tua domanda. Quindi immagino che questo sia stato gestito in 1.2
Mohammad AbuShady

Grande! Grazie per averlo capito per me. Terrò la domanda aperta ancora un po 'per vedere se nessuno ha una risposta per nginx <v1.2
gennaio

1
Immagino che dovrò aggiornare allora :-) Avevo comunque bisogno di una scusa
gennaio

1
service nginx reloadnon mostra nulla se la configurazione è stata caricata correttamente o meno, quindi è inutile se si sospetta che la configurazione possa essere errata. service nginx restartfermerà il server se la configurazione ha un errore!
Dan Dascalescu

80

A partire da nginx 1.8.0, la soluzione corretta è

sudo nginx -t && sudo service nginx reload

Nota che a causa di un bug, configtestrestituisce sempre un codice di uscita zero anche se il file di configurazione ha un errore.


3
nginx -t && sudo nginx -s reload
MechanisM

5
@MechanisM: nginx -tsenza sudo quasi sicuramente fallirà a causa di errori di autorizzazione.
Dan Dascalescu

Volevo mostrare principalmente l'ultima parte per il ricaricamento. Nel mio caso, ho nginx compilato in modo personalizzato e non ho nemmeno alcuno script in /etc/init.d e così via, quindi nel mio caso "service nginx reload" non farà nulla
MechanisM

39

Uso il seguente comando per ricaricare Nginx (versione 1.5.9) solo se un test di configurazione ha avuto successo:

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

Se hai bisogno di farlo spesso, potresti voler usare un alias. Uso quanto segue:

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

Il trucco qui è fatto da "&&" che esegue solo il secondo comando se il primo ha avuto successo. Puoi vedere qui una spiegazione più dettagliata dell'uso dell'operatore "&&".

Puoi usare "restart" invece di "reload" se vuoi davvero riavviare il server.


Fai attenzione a nginx 1.4.2 che ho trovato pkill -1 nginx(in effetti ciò che fa il mio init.d / nginx reload) NON si ricarica se la configurazione fallisce e restituisce in modo fuorviante successo. Controlla le tue versioni.
KCD

2
Questo non funziona per me. Entrambi i comandi vengono eseguiti anche se il test fallisce.
Mario Campa

2
configtest restituisce sempre un codice di uscita zero , almeno in nginx 1.8.0. Usa nginx -tinvece.
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 poi usa i comandi "nginx.reload" ecc ..


6

Puoi ricaricare usando /etc/init.d/nginx reloadesudo service nginx reload

Se nginx -tgenera un errore, non verrà ricaricato

quindi usa && per eseguirli entrambi contemporaneamente

piace

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


Lascia che ti insegni qualcosa sulla bash. && non run both at a same timeEsegue il comando a destra SE il comando a sinistra restituisce un codice di uscita 0. Se si nginx -tgenera un errore, il codice di uscita non sarà 0, quindi il secondo comando non verrà eseguito. È nginx -s reloadcomunque
miknik

@miknik Penso che sia quello che voleva dire, semplicemente non è uscito bene. Dice If nginx -t throws some error then it won't reload. L'istruzione run both at a same timepotrebbe anche essere interpretata come un singolo comando o una riga. Non lo interpreto necessariamente dicendo in questo caso in parallel.
matt

2

Puoi usare i segnali per controllare nginx.

Secondo la documentazione, è necessario inviare il segnale HUP al processo master nginx.

HUP - cambiare la configurazione, tenere il passo con un fuso orario modificato (solo per FreeBSD e Linux), avviare nuovi processi di lavoro con una nuova configurazione, chiusura regolare dei vecchi processi di lavoro

Controlla la documentazione qui: http://nginx.org/en/docs/control.html

È possibile inviare il segnale HUP al PID del processo master nginx in questo modo:

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

Il comando precedente legge il PID nginx da /var/run/nginx.pid. Per impostazione predefinita, viene scritto nginx pid, /usr/local/nginx/logs/nginx.pidma può essere sovrascritto in config. Controlla il tuo nginx.configper vedere dove salva il PID.


1

Almeno su Debian lo script di avvio nginx ha una funzione di ricarica che fa:

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 $?
  ;;

Sembra che tutto ciò che devi fare è chiamare service nginx reloadinvece che restartdal momento che chiama test_nginx_config.


service nginx reloadnon darà alcun tipo di indicazione sul fatto che la configurazione sia stata testata correttamente o meno, o se sia stata ricaricata o meno.
Dan Dascalescu

Cosa test_nginx_configfare allora in quel caso?
Daenney

1
Penso che entrambi abbiate ragione. service nginx reloadè sufficiente sulla riga di comando, tuttavia a volte potresti voler acquisire l'output di stderr e restituirlo a uno script per la risoluzione dei problemi. nginx -tti dirà quale file ha il parametro non valido e su quale riga.
anastymous
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.