Que ressentez-vous lorsque votre client envoie sur WhatsApp une capture d'écran de son site Web indiquant 502 bad gateway NGINX Erreur? Rien ne peut être pire que cela (pour commencer votre journée), n'est-ce pas ? Bien que je souhaite que vous ne commenciez pas votre journée comme ça, je vais vous expliquer comment récupérer si vous étiez dans cette situation.
Avant de discuter du problème et de sa solution, je voudrais rappeler que mon environnement d'hébergement est alimenté par le serveur Web NGINX avec un gestionnaire PHP FPM.
Raison de l'erreur 502 Bad Gateway NGINX
J'ai commencé à déboguer l'erreur à partir du journal des erreurs NGINX (/var/log/nginx/nginx.log)
et trouvé le message d'erreur ci-dessous.
2019/12/11 04:30:43 [error] 27570#27570: *48599 connect() to unix:/var/run/php-fpm/php-fpm.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: 17.58.98.98, server: techglimpse.com, request: "GET /pure-css3-shapes/ HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm/php-fpm.sock:", host: "techglimpse.com"
Il est évident que le message d'erreur est lié au gestionnaire PHP et cela m'a redirigé vers le journal des erreurs PHP-FPM à /var/log/php-fpm/error.log
et j'ai remarqué le message d'erreur ci-dessous :
[08-Dec-2019 03:30:01] NOTICE: error log file re-opened [10-Dec-2019 21:00:16] WARNING: [pool www] server reached pm.max_children setting (50), consider raising it
Il est maintenant clair que le processus maître PHP-FPM est incapable de générer de nouveaux processus enfants en raison de pm.max_children
atteint la limite, provoquant une erreur de passerelle 502 incorrecte.
Comment corriger l'erreur :le serveur a atteint le paramètre pm.max_children, envisagez de l'augmenter
La solution est d'augmenter le pm.max_children
limite basée sur les spécifications du serveur. Notez que n'augmentez pas aveuglément la limite, car si le site Web reçoit un trafic énorme, les travailleurs ne sont jamais recyclés, l'utilisation de la RAM augmentera indéfiniment avec le temps et le serveur sera en état de mémoire insuffisante.
Par conséquent, pm.max_children
doit être augmenté avec précaution et progressivement tout en surveillant l'utilisation du swap.
pm.max_children = ((total RAM in MB) - (RAM usage by MySQL and others taken together in MB)) / 80Noter
Ici, 80 Mo est le poids moyen d'un processus de travail PHP-FPM.
Sur la base du calcul ci-dessus, augmentez la valeur pm.max_children dans le fichier de configuration de domaine respectif de PHP-FPM. Dans mon cas : /etc/php-fpm.d/techglimpse.conf
pm = ondemand pm.max_children = 200
Redémarrez maintenant les services PHP-FPM et NGINX
systemctl restart php-fpm nginxNoter
Filtrez tous les domaines qui ont été affectés avec pm.max_children
et appliquez les paramètres ci-dessus uniquement à ceux qui sont concernés.
Comment trouver la mémoire utilisée par les applications
Exécutez la commande ci-dessous pour trouver la mémoire utilisée par les applications respectives.
#ps -o pid,user,%mem,command ax | sort -b -k3 -r PID USER %MEM COMMAND 1355 mysql 14.5 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid 543 root 0.3 /usr/lib/systemd/systemd-journald 9254 nginx 0.3 php-fpm: pool www 9251 nginx 0.3 php-fpm: pool www
Dans l'exemple ci-dessus, MySQL utilise près de 14 % de la mémoire totale.