¿Cómo te sientes cuando tu cliente envía por WhatsApp una captura de pantalla de su sitio web que dice 502 bad gateway NGINX ¿error? Nada puede ser peor que esto (para empezar el día), ¿no? Si bien desearía que no comenzaras el día de esa manera, te explicaré cómo recuperarte si te pusieran en esa situación.
Antes de discutir el problema y su solución, me gustaría recordar que mi entorno de hospedaje funciona con el servidor web NGINX con un controlador FPM PHP.
Motivo del error 502 Bad Gateway NGINX
Empecé a depurar el error del registro de errores de NGINX (/var/log/nginx/nginx.log)
y encontré el siguiente mensaje de error.
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 evidente que el mensaje de error está relacionado con el controlador de PHP y eso me redirigió para buscar en el registro de errores de PHP-FPM en /var/log/php-fpm/error.log
y noté el siguiente mensaje de error:
[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
Ahora está claro que el proceso maestro de PHP-FPM no puede generar nuevos procesos secundarios debido a pm.max_children
llegando al límite, provocando un error de puerta de enlace incorrecta 502.
Cómo solucionar el error:el servidor alcanzó la configuración pm.max_children, considere generarlo
La solución es aumentar el pm.max_children
límite basado en las especificaciones del servidor. Tenga en cuenta que no aumente ciegamente el límite, porque si el sitio web recibe un gran tráfico, los trabajadores nunca se reciclan, el uso de RAM crecerá indefinidamente con el tiempo y el servidor se quedará sin memoria.
Por lo tanto, pm.max_children
debe aumentarse con cuidado y gradualmente mientras se supervisa el uso de intercambio.
pm.max_children = ((total RAM in MB) - (RAM usage by MySQL and others taken together in MB)) / 80Nota
Aquí 80 MB es el peso promedio de un proceso de trabajo de PHP-FPM.
Según el cálculo anterior, aumente el valor de pm.max_children en el archivo de configuración de dominio respectivo de PHP-FPM. En mi caso: /etc/php-fpm.d/techglimpse.conf
pm = ondemand pm.max_children = 200
Ahora reinicie los servicios PHP-FPM y NGINX
systemctl restart php-fpm nginxNota
Filtra todos los dominios que se han visto afectados con pm.max_children
y aplique la configuración anterior solo a los afectados.
Cómo encontrar la memoria utilizada por las aplicaciones
Ejecute el siguiente comando para encontrar la memoria utilizada por las respectivas aplicaciones.
#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
En el ejemplo anterior, MySQL utiliza casi el 14 % de la memoria total.