Maison Opération et maintenance Nginx Exemple d'analyse d'ensemble de signaux nginx

Exemple d'analyse d'ensemble de signaux nginx

May 13, 2023 am 10:37 AM
nginx

Reproduction de scénario

Ci-dessous, j'utiliserai un nginx natif pour reproduire ce processus sur ma machine virtuelle avec fedora26 installé. La version de nginx que j'utilise est la dernière 1.13.4

Premier démarrage de nginx

Exemple danalyse densemble de signaux nginx

Vous pouvez voir que les deux. le maître et le travailleur sont déjà en cours d'exécution.

Ensuite, nous envoyons un signal sigusr2 au maître Lorsque le noyau nginx reçoit ce signal, il déclenchera une mise à jour à chaud.

Exemple danalyse densemble de signaux nginx

Vous pouvez voir que le nouveau maître et les ouvriers créés par le maître sont déjà en cours d'exécution, à ce moment-là, nous envoyons alors un signal sigwinch à l'ancien maître. Après avoir reçu ce signal, l'ancien maître enverra sigquit à. ses ouvriers. , donc le processus de travail de l'ancien maître va se terminer :

Exemple danalyse densemble de signaux nginx

À ce moment, seuls l'ancien maître, le nouveau maître et les ouvriers du nouveau maître restent en marche, ce qui est similaire à la situation de opération en ligne à ce moment-là.

Ensuite, nous utilisons la commande stop :

Exemple danalyse densemble de signaux nginx

Nous constaterons que le nouveau maître et ses ouvriers sont sortis, tandis que l'ancien maître est toujours en cours d'exécution et a engendré des ouvriers. C’était la situation en ligne à cette époque.

En fait, ce phénomène est lié à la conception de nginx lui-même : lorsque l'ancien maître est prêt à créer un nouveau maître, il renommera le fichier nginx.pid en nginx.pid.oldbin, puis créera le nouveau maître. Le maître crée un nouveau nginx.pid. Ce fichier enregistrera le pid du nouveau maître. nginx pense qu'une fois la mise à jour à chaud terminée, la mission de l'ancien maître est presque terminée et il se terminera à tout moment, donc toutes les opérations ultérieures devraient être prises en charge par le nouveau maître. Bien sûr, il n'est pas valide de tenter une autre mise à jour à chaud en envoyant sigusr2 au nouveau maître sans que l'ancien maître ne se ferme. Le nouveau maître ignorera simplement ce signal et poursuivra son propre travail.

Analyse du problème

Ce qui est plus regrettable, c'est que la table lua que nous avons mentionnée ci-dessus, le fichier lua qui la définit, a déjà été chargée en mémoire par luajit et compilée en bytecode lors de l'exécution du hook init_by_lua. Donc évidemment, l'ancien maître ne doit pas. avoir cette table Lua, car la partie du code Lua qu'elle charge est une ancienne version.

Le code Lua qui indexe la table n'est pas utilisé lors de init_by_lua. Ces codes sont chargés dans le processus de travail à ce stade, les codes du répertoire du projet sont tous les plus récents, donc le processus de travail charge tous les codes les plus récents. si ces processus de travail traitent les requêtes pertinentes, une erreur d'exécution Lua se produira et la manifestation externe sera le http 500 correspondant.

Après avoir absorbé cette leçon, nous devons arrêter notre service nginx de manière plus rationnelle. Un script de démarrage et d'arrêt du service nginx plus raisonnable est donc nécessaire. Certains scripts diffusés sur Internet ne traitent pas de ce phénomène. Il faut se référer au script officiel fourni par nginx.

Exemple danalyse densemble de signaux nginx

Ce code est cité du site officiel de nginx /etc/init.d/nginx .

Ensemble de signaux nginx

Ensuite, trions de manière exhaustive l'ensemble de signaux nginx. Les détails du code source ne seront pas impliqués ici. Les étudiants intéressés peuvent lire eux-mêmes le code source correspondant.

Nous avons deux façons d'envoyer des signaux au processus maître, l'une via le signal nginx -s et l'autre consiste à l'envoyer manuellement via la commande kill.

Le principe de la première méthode est de générer un nouveau processus, qui obtient le pid du processus maître via le fichier nginx.pid, puis envoie le signal correspondant au maître, puis se termine. Ce processus est appelé signaleur.

La deuxième méthode nous oblige à comprendre le mappage du signal nginx -s avec les signaux réels. Le tableau suivant présente leur relation de mappage : 

signal d'opération
reload sighup
réouvrir sigusr1
stop sigterm
quit sigquit
hot update sigusr2 & sigwinch & sigquit
stop vs quit

stop envoie le signal sigterm, indiquant la nécessité de forcer la sortie , et quit est envoyé sigquit signifie quitter gracieusement. La différence spécifique est qu'une fois que le processus de travail a reçu le message sigquit (notez que le signal n'est pas envoyé directement, le message est donc utilisé à la place), il fermera le socket d'écoute, fermera la connexion actuellement inactive (la connexion qui peut être préemptée ), puis traitez-le à l'avance. Tous les événements de minuterie se terminent à la fin. Sauf circonstances particulières, quitter doit être utilisé au lieu de stop.

reload

Après avoir reçu le soupir, le processus maître réanalysera le fichier de configuration, demandera la mémoire partagée et une série d'autres tâches, puis générera un lot de nouveaux processus de travail et enfin enverra le message sigquit correspondant à l'ancien processus de travail et a finalement réalisé l'opération de redémarrage de manière transparente.

réouverture

Une fois que le processus maître a reçu sigusr1, il rouvrira tous les fichiers ouverts (tels que les journaux), puis enverra les informations sigusr1 à chaque processus de travail. Une fois que le processus de travail aura reçu le signal, il effectuera la même opération. La réouverture peut être utilisée pour la coupe de journaux. Par exemple, nginx fournit officiellement une solution :

Exemple danalyse densemble de signaux nginx

Ici, sleep 1 est nécessaire, car entre le processus maître qui envoie le message sigusr1 au processus de travail et le processus de travail rouvrant réellement access.log. , il y a Pendant un certain temps, le processus de travail écrit toujours des journaux dans le fichier access.log.0. En dormant 1 seconde, l'intégrité des informations du journal access.log.0 est assurée (si la compression est effectuée directement sans veille, une perte de journal est susceptible de se produire).

mise à jour à chaud

Parfois, nous devons effectuer une mise à jour binaire à chaud. nginx inclut cette fonction lors de la conception, mais elle ne peut pas être effectuée via la ligne de commande fournie par nginx.

En reproduisant le problème ci-dessus, vous devriez avoir compris comment effectuer une mise à jour à chaud. Nous devons d'abord envoyer sigusr2 au processus maître actuel. Ensuite, le maître renommera nginx.pid en nginx.pid.oldbin, puis en créera un nouveau. one. process, le nouveau processus utilisera l'appel système execve pour remplacer l'image de processus actuelle par le nouveau fichier nginx elf et devenir le nouveau processus maître. Une fois le nouveau processus maître démarré, il effectuera l'analyse du fichier de configuration et d'autres opérations, puis lancera le nouveau processus de travail pour commencer à travailler.

Ensuite, nous envoyons le signal sigwinch à l'ancien maître, puis l'ancien processus maître enverra le message sigquit à son processus de travail, provoquant la sortie du processus de travail. L'envoi de sigwinch et sigquit au processus maître entraînera la fermeture du processus de travail, mais le premier ne provoquera pas non plus la fermeture du processus maître.

Enfin, si nous sentons que l'ancien processus maître a rempli sa mission, nous pouvons lui envoyer le signal sigquit pour le laisser sortir.

Comment le processus de travail gère le message de signal du maître

En fait, le processus maître communique avec le processus de travail, non pas en utilisant la fonction kill, mais en utilisant le canal nginx implémenté via le tube. À l'extrémité du canal (comme les informations de signal), le processus de travail reçoit des informations de l'autre extrémité. L'événement de canal nginx est ajouté au planificateur d'événements (comme epoll, kqueue) lorsque le processus de travail se lance, donc quand il y en a. les données envoyées par le maître, c'est-à-dire peuvent être notifiées par le planificateur d'événements.

nginx est conçu de cette façon pour une raison. En tant qu'excellent serveur proxy inverse, nginx recherche des performances extrêmement élevées et le gestionnaire de signaux interrompra l'exécution du processus de travail, provoquant la suspension de tous les événements pendant une fenêtre temporelle. est une certaine perte de performance.

Beaucoup de gens peuvent penser que lorsque le processus maître envoie des informations au processus de travail, le processus de travail répondra immédiatement avec les opérations correspondantes. Cependant, le processus de travail est très occupé. Il traite constamment les événements réseau et les événements de minuterie. canal Après le gestionnaire d'événements, nginx traite simplement quelques indicateurs. Ces actions sont en fait exécutées une fois qu'une série de planification d'événements est terminée. Par conséquent, il y a une fenêtre de temps entre les deux. Surtout lorsque l'entreprise est complexe et que le trafic est énorme, cette fenêtre peut être agrandie. C'est pourquoi le plan de coupe de journaux fourni par nginx nécessite officiellement 1 veille.

Bien sûr, nous pouvons également contourner le processus maître et envoyer des signaux directement au processus de travail. Les signaux que le travailleur peut gérer sont

effet de signal
sigint force exit
sigterm force exit
sigquit graceful exit
sigusr1 rouvrez le fichier.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Vous avez un jeu croisé?
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment vérifier si Nginx est démarré Comment vérifier si Nginx est démarré Apr 14, 2025 pm 01:03 PM

Comment confirmer si Nginx est démarré: 1. Utilisez la ligne de commande: SystemCTl Status Nginx (Linux / Unix), netStat -ano | Findstr 80 (Windows); 2. Vérifiez si le port 80 est ouvert; 3. Vérifiez le message de démarrage NGINX dans le journal système; 4. Utilisez des outils tiers, tels que Nagios, Zabbix et Icinga.

Comment configurer Nginx dans Windows Comment configurer Nginx dans Windows Apr 14, 2025 pm 12:57 PM

Comment configurer Nginx dans Windows? Installez Nginx et créez une configuration d'hôte virtuelle. Modifiez le fichier de configuration principale et incluez la configuration de l'hôte virtuel. Démarrer ou recharger nginx. Testez la configuration et affichez le site Web. Activer sélectivement SSL et configurer les certificats SSL. Définissez sélectivement le pare-feu pour permettre le trafic Port 80 et 443.

Comment configurer le nom de domaine du serveur cloud dans nginx Comment configurer le nom de domaine du serveur cloud dans nginx Apr 14, 2025 pm 12:18 PM

Comment configurer un nom de domaine NGINX sur un serveur cloud: Créez un enregistrement A pointant vers l'adresse IP publique du serveur cloud. Ajoutez des blocs d'hôtes virtuels dans le fichier de configuration Nginx, en spécifiant le port d'écoute, le nom de domaine et le répertoire racine du site Web. Redémarrez Nginx pour appliquer les modifications. Accéder à la configuration du test de nom de domaine. Autres notes: Installez le certificat SSL pour activer HTTPS, assurez-vous que le pare-feu autorise le trafic Port 80 et attendez que la résolution DNS prenne effet.

Comment démarrer le serveur Nginx Comment démarrer le serveur Nginx Apr 14, 2025 pm 12:27 PM

Le démarrage d'un serveur Nginx nécessite différentes étapes en fonction des différents systèmes d'exploitation: Système Linux / Unix: Installez le package NGINX (par exemple, en utilisant Apt-Get ou Yum). Utilisez SystemCTL pour démarrer un service NGINX (par exemple, sudo systemctl start nginx). Système Windows: téléchargez et installez les fichiers binaires Windows. Démarrer Nginx à l'aide de l'exécutable Nginx.exe (par exemple, nginx.exe -c conf \ nginx.conf). Peu importe le système d'exploitation que vous utilisez, vous pouvez accéder au serveur IP

Comment résoudre l'erreur Nginx304 Comment résoudre l'erreur Nginx304 Apr 14, 2025 pm 12:45 PM

Réponse à la question: 304 Erreur non modifiée indique que le navigateur a mis en cache la dernière version de ressource de la demande du client. Solution: 1. Effacer le cache du navigateur; 2. Désactiver le cache du navigateur; 3. Configurer Nginx pour permettre le cache client; 4. Vérifier les autorisations du fichier; 5. Vérifier le hachage du fichier; 6. Désactiver le CDN ou le cache proxy inversé; 7. Redémarrez Nginx.

Comment vérifier si Nginx est démarré? Comment vérifier si Nginx est démarré? Apr 14, 2025 pm 12:48 PM

Dans Linux, utilisez la commande suivante pour vérifier si Nginx est démarré: SystemCTL Status Nginx Juges Basé sur la sortie de la commande: si "Active: Active (Running)" s'affiche, Nginx est démarré. Si "Active: Inactive (Dead)" est affiché, Nginx est arrêté.

Comment résoudre nginx403 Comment résoudre nginx403 Apr 14, 2025 am 10:33 AM

Comment corriger l'erreur interdite Nginx 403? Vérifier les autorisations de fichier ou de répertoire; 2. Vérifier le fichier .htaccess; 3. Vérifiez le fichier de configuration NGINX; 4. Redémarrer Nginx. D'autres causes possibles incluent les règles de pare-feu, les paramètres de Selinux ou les problèmes d'application.

Comment démarrer Nginx dans Linux Comment démarrer Nginx dans Linux Apr 14, 2025 pm 12:51 PM

Étapes pour démarrer Nginx dans Linux: Vérifiez si Nginx est installé. Utilisez SystemCTL Start Nginx pour démarrer le service NGINX. Utilisez SystemCTL Activer Nginx pour activer le démarrage automatique de Nginx au démarrage du système. Utilisez SystemCTL Status Nginx pour vérifier que le démarrage est réussi. Visitez http: // localhost dans un navigateur Web pour afficher la page de bienvenue par défaut.

See all articles