Hemos estado usando NGINX y php-fpm.
Hemos notado que algunas solicitudes cuelgan durante mucho tiempo (más de 10, más de 20 minutos...) a través dearribadominio.
Además, se detectaron algunas solicitudes sospechosas (me refiero a bots) en la entrada del registro de acceso (NGINX), pero no estoy seguro de si estas solicitudes sospechosas tienen algo que ver con las solicitudes que están bloqueadas o no.
Entonces mi pregunta principal es:
¿Es posible (a través de configuración o lo que sea) asociar el PID de php-fpm a la entrada de URL en el registro de acceso?
¿O existe alguna herramienta que pueda ayudarme con esta tarea?
Información adicional:
Tenemos el código fuente ya que somos los principales desarrolladores.
¡Gracias de antemano!
Respuesta1
Es problemático identificar el proceso php-fpm correcto desde el lado de nginx, porque esencialmente te estás comunicando con una caja negra a través de un socket Unix o un socket tcp, sin mencionar los subprocesos.
Puedes atacar el problema desde el lado de php. Puede usar getmypid() desde su script php, o si este no es su código, puede usar la opción php_value auto_prepend_file en la configuración de php fpm. De esta manera, puede insertar su propio código al comienzo de cada archivo php y registrar el pid junto con el REQUEST_URI correspondiente como desee. Tienes la conexión deseada. Sin embargo, prepárese para grandes iops en un sitio ocupado...
Si solo necesita el pid, podría ser más fácil habilitar php-status como se documenta aquíhttps://easyengine.io/tutorials/php/fpm-status-page/y verifique su servidor/php-status?completo
Respuesta2
Generalmente, este tipo de problemas se maneja mediante el llamado RequestId
Simplemente establezca dos encabezados: X-REQUEST-ID
y X-CORRELATION-ID
agréguelos a los registros tanto en nginx como en php.
RequestId
debe establecerse en un valor aleatorio (yo uso UUID) al comienzo de cada solicitud y CorrelationId
debe establecerse en un valor aleatorio en cada interacción del usuario. Para sitios web pequeños normalmente hay solo uno RequestID
y uno CorrelationId
. Si utiliza microservicios, cada microservicio generará el suyo propio RequestId
, pero CorrelationId
se compartirá entre ellos.
La implementación depende de su infraestructura, pero una sencilla podría verse así:
# in nginx config
location / {
proxy_pass http://upstream;
proxy_set_header X-Request-Id $request_id;
...
}
# or
location / {
fastcgi_pass unix:/path/to/socket;
fastcgi_param HTTP_X_REQUEST_ID $request_id;
...
}
# This works because nginx generates a random string and stores it as $request_id
Luego simplemente registra tu pid en PHP:
# in php-fpm config
# %p - pid
access.format = "[%p][%{HTTP_X_REQUEST_ID}e] %R - %u %t \"%m %r\" %s"
# or in php application itself
# index.php
<?php
file_put_contents('somewhere.log', sprintf('[%s][%d]', $_SERVER['HTTP_X_REQUEST_ID'] ?? 'N/A', getmypid()), FILE_APPEND);
...
Respuesta3
Si tiene habilitada la página de estado de php-fpm, podría considerar verificar el modo completo para rastrear pids. Por ejemplo, usandohttp://ejemplo.com/phpfpm-status?fullDebería ser posible descubrir qué está pasando. (Como nota relacionada con la seguridad: nunca se deben dejar dichas páginas de estado accesibles públicamente).
Respuesta4
Debería utilizar el registro lento de PHP-FPM: Configuración request_slowlog_timeout
y también slowlog
- consulteDocumentos de configuración de php-fpm- debería proporcionarle un seguimiento de pila de todos los procesos php-fpm de larga ejecución; incluyendo su PID.