NGINX+PHP-FPM: ¿Es posible asociar el PID de php-fpm para acceder a la entrada del registro?

NGINX+PHP-FPM: ¿Es posible asociar el PID de php-fpm para acceder a la entrada del registro?

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-IDy X-CORRELATION-IDagréguelos a los registros tanto en nginx como en php.

RequestIddebe establecerse en un valor aleatorio (yo uso UUID) al comienzo de cada solicitud y CorrelationIddebe establecerse en un valor aleatorio en cada interacción del usuario. Para sitios web pequeños normalmente hay solo uno RequestIDy uno CorrelationId. Si utiliza microservicios, cada microservicio generará el suyo propio RequestId, pero CorrelationIdse 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_timeouty 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.

información relacionada