Jak se cítíte, když váš klient WhatsApp vytvoří snímek obrazovky svého webu s nápisem 502 špatná brána NGINX chyba? Nic nemůže být horší než tohle (pro začátek dne), že? I když si přeji, abyste svůj den nezačínali takhle, vysvětlím vám, jak se zotavit, pokud jste se do takové situace dostali.
Než probereme problém a jeho řešení, rád bych připomněl, že mé hostitelské prostředí je poháněno webovým serverem NGINX s obslužným programem FPM PHP.
Důvod chyby 502 Bad Gateway NGINX
Začal jsem ladit chybu z protokolu chyb NGINX (/var/log/nginx/nginx.log)
a našli níže uvedenou chybovou zprávu.
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"
Je zřejmé, že chybová zpráva souvisí s obslužným programem PHP a přesměrovala mě, abych se podíval do protokolu chyb PHP-FPM na adrese /var/log/php-fpm/error.log
a všimli si níže uvedené chybové zprávy:
[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
Nyní je jasné, že hlavní proces PHP-FPM není schopen vytvořit nové podřízené procesy kvůli pm.max_children
dosažení limitu, což způsobí chybu brány 502.
Jak opravit chybu:server dosáhl nastavení pm.max_children, zvažte zvýšení
Řešením je zvýšit pm.max_children
limit na základě specifikací serveru. Všimněte si, že limit slepě nezvyšujte, protože pokud web zaznamená velký provoz, pak se pracovníci nikdy nerecyklují, využití paměti RAM poroste s časem a server bude mít nedostatek paměti.
Proto pm.max_children
by měl být opatrně a postupně zvyšován při sledování využití swapu.
pm.max_children = ((total RAM in MB) - (RAM usage by MySQL and others taken together in MB)) / 80Poznámka
Zde je 80 MB průměrná váha pracovního procesu PHP-FPM.
Na základě výše uvedeného výpočtu zvyšte hodnotu pm.max_children v příslušném konfiguračním souboru domény PHP-FPM. V mém případě: /etc/php-fpm.d/techglimpse.conf
pm = ondemand pm.max_children = 200
Nyní restartujte služby PHP-FPM a NGINX
systemctl restart php-fpm nginxPoznámka
Filtrujte všechny domény, které byly ovlivněny pomocí pm.max_children
a použijte výše uvedená nastavení pouze na ty, kterých se to týká.
Jak najít paměť využívanou aplikacemi
Spusťte níže uvedený příkaz a vyhledejte paměť využívanou příslušnými aplikacemi.
#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
Ve výše uvedeném příkladu používá MySQL téměř 14 % celkové paměti.