Come ti senti quando il tuo cliente riceve su WhatsApp uno screenshot del suo sito web che dice 502 bad gateway NGINX errore? Niente può essere peggio di questo (per iniziare la giornata), vero? Anche se vorrei che tu non iniziassi la giornata in quel modo, ti spiegherò come riprenderti se ti trovassi in quella situazione.
Prima di discutere il problema e la sua soluzione, vorrei ricordare che il mio ambiente di hosting è alimentato dal server Web NGINX con un gestore PHP FPM.
Motivo dell'errore 502 Bad Gateway NGINX
Ho iniziato a eseguire il debug dell'errore dal registro degli errori di NGINX (/var/log/nginx/nginx.log)
e ho trovato il seguente messaggio di errore.
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"
È evidente che il messaggio di errore è correlato al gestore PHP e che mi ha reindirizzato a esaminare il registro degli errori PHP-FPM in /var/log/php-fpm/error.log
e ho notato il seguente messaggio di errore:
[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
Ora è chiaro che il processo master PHP-FPM non è in grado di generare nuovi processi figlio a causa di pm.max_children
raggiungimento del limite, causando 502 errori di gateway non validi.
Come correggere l'errore:il server ha raggiunto l'impostazione pm.max_children, considera di aumentarla
La soluzione è aumentare il pm.max_children
limite in base alle specifiche del server. Nota, non aumentare alla cieca il limite, perché se il sito Web riceve un traffico enorme, i lavoratori non vengono mai riciclati, l'utilizzo della RAM aumenterà indefinitamente nel tempo e il server sarà in condizioni di memoria insufficiente.
Pertanto, pm.max_children
dovrebbe essere aumentato in modo accurato e graduale durante il monitoraggio dell'utilizzo dello scambio.
pm.max_children = ((total RAM in MB) - (RAM usage by MySQL and others taken together in MB)) / 80Nota
Qui 80 MB è il peso medio di un processo di lavoro PHP-FPM.
Sulla base del calcolo precedente, aumentare il valore pm.max_children nel rispettivo file di configurazione del dominio di PHP-FPM. Nel mio caso: /etc/php-fpm.d/techglimpse.conf
pm = ondemand pm.max_children = 200
Ora riavvia i servizi PHP-FPM e NGINX
systemctl restart php-fpm nginxNota
Filtra tutti i domini interessati da pm.max_children
e applica le impostazioni di cui sopra solo a quelle interessate.
Come trovare la memoria utilizzata dalle applicazioni
Esegui il comando seguente per trovare la memoria utilizzata dalle rispettive applicazioni.
#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
Nell'esempio sopra, MySQL utilizza quasi il 14% della memoria totale.