NGINX+PHP-FPM: É possível associar o PID do php-fpm para acessar a entrada do log?

NGINX+PHP-FPM: É possível associar o PID do php-fpm para acessar a entrada do log?

Temos usado NGINX e php-fpm.

Temos notado que algumas solicitações ficam suspensas por muito tempo (10+, 20+ minutos...) viaprincipalcomando.
Além disso, algumas solicitações suspeitas (quero dizer, bots) foram detectadas na entrada do log de acesso (NGINX), mas não tenho certeza se essas solicitações suspeitas têm algo a ver com as solicitações que estão suspensas ou não.

Então minha pergunta principal é:

É possível (via configuração ou qualquer outra coisa) associar o PID do php-fpm à entrada de URL no log de acesso?
Ou existe alguma ferramenta que possa me ajudar nessa tarefa?

Informações adicionais:
Temos o código-fonte porque somos os principais desenvolvedores.

Desde já, obrigado!

Responder1

É problemático identificar o processo php-fpm correto do lado do nginx, porque você está essencialmente se comunicando com uma caixa preta por meio de soquete unix ou soquete tcp, sem mencionar threads.

Você pode atacar o problema do lado do php. Você pode usar getmypid() do seu script php ou, se este não for o seu código, você pode usar a opção php_value auto_prepend_file na configuração do php fpm. Desta forma você pode inserir seu próprio código no início de cada arquivo php e registrar o pid junto com o REQUEST_URI correspondente conforme desejar. Você tem a conexão desejada. Prepare-se para grandes iops em um site movimentado...

Se você só precisa do pid, pode ser mais fácil habilitar o status do php conforme documentado aquihttps://easyengine.io/tutorials/php/fpm-status-page/e verifique seu servidor/php-status?full

Responder2

Geralmente, esse tipo de problema é tratado usando o chamado RequestId Simplesmente definir dois cabeçalhos: X-REQUEST-IDe X-CORRELATION-IDadicioná-los aos logs no nginx e no lado do php.

RequestIddeve ser definido com um valor aleatório (eu uso UUID) no início de cada solicitação e CorrelationIddeve ser definido com um valor aleatório em cada interação do usuário. Para sites pequenos, geralmente há apenas um RequestIDe um CorrelationId. Se você usar microsserviços, cada microsserviço gerará seu próprio arquivo RequestId, mas CorrelationIdserá compartilhado entre eles.

A implementação depende da sua infraestrutura, mas uma simples poderia ser assim:

# 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

Em seguida, basta registrar seu pid em 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);
...

Responder3

Se você tiver a página de status do php-fpm ativada, considere verificar o modo completo para rastrear pids. Por exemplo, usandohttp://example.com/phpfpm-status?fulldeve ser possível descobrir o que está acontecendo. (Como observação relacionada à segurança: nunca se deve deixar essas páginas de status acessíveis ao público.)

Responder4

Você deve utilizar o log lento do PHP-FPM: Configuração, request_slowlog_timeoutbem como slowlog- consultedocumentos de configuração do php-fpm- deve fornecer um Stack Trace de todos os processos php-fpm de longa execução; incluindo seu PID.

informação relacionada