Contrôler nginx
Le nginx peut être contrôlé à l'aide de signaux. L'ID de processus du processus maître est écrit par défaut dans le fichier /usr/local/nginx/logs/nginx.pid. Ce nom peut être modifié au moment de la configuration ou dans nginx.conf à l'aide de la directive pid. Le processus maître prend en charge les signaux suivants :
Signal | Description |
---|---|
TERM, INT | Arrêt rapide |
QUIT | Arrêt gracieux |
HUP | Modification de la configuration, suivi d'un fuseau horaire modifié (uniquement pour FreeBSD et Linux), démarrage de nouveaux processus de travail avec une nouvelle configuration, arrêt progressif des anciens processus de travail. |
USR1 | Réouverture des fichiers journaux |
USR2 | Mise à niveau d'un fichier exécutable |
WINCH | Arrêt gracieux des processus de travail |
Les processus de travail individuels peuvent également être contrôlés à l'aide de signaux, même si cela n'est pas obligatoire. Les signaux pris en charge sont les suivants :
Signal | Description |
---|---|
TERM, INT | Arrêt rapide |
QUIT | Arrêt gracieux |
USR1 | Réouverture des fichiers journaux |
WINCH | Arrêt anormal pour le débogage (nécessite l'activation de debug_points) |
Modification de la configuration
Pour que nginx puisse relire le fichier de configuration, un signal HUP doit être envoyé au processus maître. Le processus maître vérifie d'abord la validité de la syntaxe, puis essaie d'appliquer une nouvelle configuration, c'est-à-dire d'ouvrir des fichiers journaux et de nouveaux sockets d'écoute. Si cela échoue, il annule les modifications et continue de travailler avec l'ancienne configuration. Si cela réussit, il démarre de nouveaux processus de travail et envoie des messages aux anciens processus de travail leur demandant de s'arrêter correctement. Les anciens processus de travail ferment les sockets d'écoute et continuent de servir les anciens clients. Une fois tous les clients servis, les anciens processus de travail sont arrêtés.
Illustrons cela par un exemple. Imaginons que nginx soit exécuté sur FreeBSD et que la commande :
ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep '(nginx|PID)' |
produit la sortie suivante :
PID PPID USER %CPU VSZ WCHAN COMMAND 33126 1 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx 33127 33126 nobody 0.0 1380 kqread nginx: worker process (nginx) 33128 33126 nobody 0.0 1364 kqread nginx: worker process (nginx) 33129 33126 nobody 0.0 1364 kqread nginx: worker process (nginx) |
Si HUP est envoyé au processus maître, la sortie devient :
PID PPID USER %CPU VSZ WCHAN COMMAND 33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx 33129 33126 nobody 0.0 1380 kqread nginx: worker process is shutting down (nginx) 33134 33126 nobody 0.0 1368 kqread nginx: worker process (nginx) 33135 33126 nobody 0.0 1368 kqread nginx: worker process (nginx) 33136 33126 nobody 0.0 1368 kqread nginx: worker process (nginx) |
L'un des anciens processus de travail avec le PID 33129 continue de fonctionner. Après un certain temps, il se ferme :
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 1368 kqread nginx: worker process (nginx) 33136 33126 nobody 0.0 1368 kqread nginx: worker process (nginx) |
Rotation des fichiers journaux
Pour faire tourner les fichiers journaux, il faut d'abord les renommer. Ensuite, le signal USR1 doit être envoyé au processus maître. Le processus maître rouvre alors tous les fichiers journaux actuellement ouverts et leur attribue un utilisateur non privilégié sous lequel les processus de travail s'exécutent, en tant que propriétaire. Après une réouverture réussie, le processus maître ferme tous les fichiers ouverts et envoie le message au processus de travail pour lui demander de rouvrir les fichiers. Les processus de travail ouvrent également de nouveaux fichiers et ferment immédiatement les anciens fichiers. Par conséquent, les anciens fichiers sont presque immédiatement disponibles pour le post-traitement, comme la compression.
Mise à niveau de l'exécutable à la volée
Pour mettre à niveau l'exécutable du serveur, le nouveau fichier exécutable doit d'abord être placé à la place d'un ancien fichier. Ensuite, le signal USR2 doit être envoyé au processus maître. Le processus maître renomme d'abord son fichier avec l'ID de processus en un nouveau fichier avec le suffixe .oldbin, par exemple /usr/local/nginx/logs/nginx.pid.oldbin, puis démarre un nouveau fichier exécutable qui à son tour démarre de nouveaux processus de travail :
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) |
Après cela, tous les processus de travail (anciens et nouveaux) continuent d'accepter les demandes. Si le signal WINCH est envoyé au premier processus maître, il enverra des messages à ses processus de travail, leur demandant de s'arrêter correctement, et ils commenceront à sortir :
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) |
Après un certain temps, seuls les nouveaux processus de travail traiteront les demandes :
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) |
Il convient de noter que l'ancien processus maître ne ferme pas ses sockets d'écoute et qu'il peut être géré pour redémarrer ses processus de travail si nécessaire. Si pour une raison quelconque le nouveau fichier exécutable fonctionne de manière inacceptable, l'une des opérations suivantes peut être effectuée :
- Envoyez le signal HUP à l'ancien processus maître. L'ancien processus maître démarrera de nouveaux processus de travail sans relire la configuration. Après cela, tous les nouveaux processus peuvent être arrêtés en douceur, en envoyant le signal QUIT au nouveau processus maître.
- Envoyez le signal TERM au nouveau processus maître. Il enverra alors un message à ses processus de travail leur demandant de quitter immédiatement, et ils quitteront tous presque immédiatement. (Si les nouveaux processus ne se terminent pas pour une raison quelconque, le signal KILL doit leur être envoyé pour les forcer à quitter.) Lorsque le nouveau processus maître se termine, l'ancien processus maître démarrera automatiquement de nouveaux processus de travail.
Si le nouveau processus maître se ferme, l'ancien processus maître supprime le suffixe .oldbin du nom de fichier avec l'ID de processus.
Si la mise à niveau a réussi, le signal QUIT doit être envoyé à l'ancien processus maître et seuls les nouveaux processus resteront :
PID PPID USER %CPU VSZ WCHAN COMMAND 36264 1 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) |