Nginx - Controllare Nginx da riga di comando
Nginx mette a disposizione una serie di comandi per lo stop & start e l’aggiornamento “a caldo” dei file di configurazione e del programma. Il numero di comandi è ridotto dal momento che l’intera configurazione di Nginx è delegata allo specifico file di configurazione. L’unico comando disponibile è il semplice comando nginx.
Opzioni
E’ possibile invocare il comando Nginx seguito da una serie di parametri:
-c </percorso/file/configurazione>: Permette di specificare un file di configurazione differente rispetto a quello specificato in fare di compilazione-t: Controlla la correttezza del file di configurazione; da utilizzare dopo ogni cambiamento al file per controllare la correttezza sintattica della configurazione-v: Mostra a schermo la versione di Nginx-V: Stampa a video la versione di Nginx, del compilatore e i relativi parametri
Controllare Nginx attraverso i segnali
E’ possibile controllare sia il processo “master” che i singoli processi “workers” attraverso i segnali. Ricordiamo che di norma Nginx registra il file pid per il processo master nel file /usr/local/nginx/logs/nginx.pid, a meno che sia stato specificato un percorso differente per mezzo del comando ./configure durante la procedura di compilazione.
Il proceddo “master” di Nginx riconosce i seguenti segnali:
- TERM, INT: shutdown rapido
- QUIT: graceful shutdown
- HUP: caricamento della nuova configurazione; avvio dei nuovi processi worker con la nuova configurazione; graceful shutdown dei processi worker attivi
- USR1: riapertura dei file di log
- USR2: aggiornamento dei file binari a caldo
- WINCH: graceful shutdown dei processi worker
Aggiornamento a caldo di configurazione e binari
Uno degli aspetti interessanti di Nginx, insieme alla facilità di configurazione e alle performance, è la possibilità di aggiornare configurazione e binari di Nginx senza interruzioni di servizio e senza perdere alcuna connessione.
Nell’esempio che segue si è proceduto a controllare la correttezza del nuovo file di configurazione, e quindi a procedere al caricamento della nuova configurazione senza procedere allo shutdown del servizio:
# nginx -t -c /etc/nginx/nginx.conf
2007/03/16 13:07:10 [info] 15686#0: the configuration file /etc/nginx/nginx.conf syntax is ok
2007/03/16 13:07:10 [info] 15686#0: the configuration file /etc/nginx/nginx.conf was tested successfully
# ps aux | egrep '(PID|nginx)'
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2213 0.0 0.0 6784 2036 ? Ss 03:01 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
# kill -HUP 2213
Dopo aver eseguito il comando kill -HUP 2213 il processo master ha caricato il nuovo file di configurazione, i processi worker che verranno istanziati utilizzeranno il nuovo file di configurazione e appena possibile i processi worker attivi procederanno allo shutdown.
Nel caso in cui Nginx non sia in grado di applicare il nuovo file di configurazione, ad esempio per un errore all’interno del file di configurazione indicato, continuerà ad utilizzare il file di configurazione già in uso.
Per procedere all’aggiornamento a caldo di Nginx, ad esempio per un aggiornamento ad una nuova versione o di seguito alla ricompilazione dei binari, è necessario:
- sovrascrivere i vecchi binari con i nuovi
- inviare il segnale USR2 al processo master attualmente attivo; Nginx provvederà a a rinominare il proprio file .pid in .oldbin e manderà in esecuzione un nuovo processo master con la nuova configurazione e i relativi processi worker
PID PPID USER %CPU VSZ WCHAN COMMAND
33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx
33134 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
33135 33126 nobody 0.0 1380 kqread nginx: worker process (nginx)
33136 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx) - A questo punto abbiamo due istanze di Nginx attive in parallelo, ognuna con il proprio processo master e i relativi worker; entrambe le istanze rispondono alle richieste http, una con la versione “vecchia” dei binari, l’altra con la nuova versione. Per disattivare la versione vecchia innazitutto inviamo un segnale WINCH al processo master, in modo da avviare la procedura di graceful shutdown dei relativi processi worker:
PID PPID USER %CPU VSZ WCHAN COMMAND
33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx
33135 33126 nobody 0.0 1380 kqread nginx: worker process is shutting down (nginx)
36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
- Dopo poco tempo tutti i processi worker che fanno capo al processo master con la versione vecchia dei binari di Nginx termineranno la propria esecuzione; solo i processi con la nuova versione dei binari risponderanno alle richieste:
PID PPID USER %CPU VSZ WCHAN COMMAND
33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx
36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
- Inviare il messaggio QUIT al processo master con la versionevecchia dei binari in modo da lasciare attuva solo la versione nuova