Wie fühlen Sie sich, wenn Ihr Kunde einen Screenshot seiner Website mit der Aufschrift 502 Bad Gateway NGINX per WhatsApp sendet? Error? Nichts kann schlimmer sein als das (um in den Tag zu starten), oder? Obwohl ich wünschte, Sie sollten Ihren Tag nicht so beginnen, werde ich Ihnen erklären, wie Sie sich erholen können, wenn Sie in diese Situation geraten.
Bevor wir das Problem und seine Lösung diskutieren, möchte ich daran erinnern, dass meine Hosting-Umgebung von einem NGINX-Webserver mit einem FPM-PHP-Handler betrieben wird.
Grund für 502 Bad Gateway NGINX-Fehler
Ich habe mit dem Debuggen des Fehlers aus dem NGINX-Fehlerprotokoll (/var/log/nginx/nginx.log)
begonnen und die folgende Fehlermeldung gefunden.
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"
Es ist offensichtlich, dass die Fehlermeldung mit dem PHP-Handler zusammenhängt, und das hat mich umgeleitet, in das PHP-FPM-Fehlerprotokoll unter /var/log/php-fpm/error.log
zu schauen und folgende Fehlermeldung bemerkt:
[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
Jetzt ist klar, dass der PHP-FPM-Masterprozess aufgrund von pm.max_children
keine neuen untergeordneten Prozesse erzeugen kann Erreichen des Limits, verursacht 502 Bad Gateway-Fehler.
So beheben Sie den Fehler:Der Server hat die pm.max_children-Einstellung erreicht, erwägen Sie, ihn zu erhöhen
Die Lösung besteht darin, pm.max_children
zu erhöhen Limit basierend auf den Serverspezifikationen. Beachten Sie, dass Sie das Limit nicht blind erhöhen, denn wenn die Website sehr viel Traffic erhält, werden die Worker nie wiederverwendet, die RAM-Nutzung wird mit der Zeit unbegrenzt zunehmen und der Server wird in einem Zustand mit unzureichendem Speicher sein.
Daher pm.max_children
sollte vorsichtig und schrittweise erhöht werden, während die Swap-Nutzung überwacht wird.
pm.max_children = ((total RAM in MB) - (RAM usage by MySQL and others taken together in MB)) / 80Notiz
Hier sind 80 MB das durchschnittliche Gewicht eines PHP-FPM-Worker-Prozesses.
Erhöhen Sie basierend auf der obigen Berechnung den pm.max_children-Wert in der entsprechenden Domänenkonfigurationsdatei von PHP-FPM. In meinem Fall: /etc/php-fpm.d/techglimpse.conf
pm = ondemand pm.max_children = 200
Starten Sie nun die PHP-FPM- und NGINX-Dienste neu
systemctl restart php-fpm nginxNotiz
Filtern Sie alle betroffenen Domains mit pm.max_children
und wenden Sie die obigen Einstellungen nur auf die betroffenen an.
So finden Sie den von Anwendungen verwendeten Speicher
Führen Sie den folgenden Befehl aus, um den von den jeweiligen Anwendungen verwendeten Speicher zu finden.
#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
Im obigen Beispiel verwendet MySQL fast 14 % des Gesamtspeichers.