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-ID
e X-CORRELATION-ID
adicioná-los aos logs no nginx e no lado do php.
RequestId
deve ser definido com um valor aleatório (eu uso UUID) no início de cada solicitação e CorrelationId
deve ser definido com um valor aleatório em cada interação do usuário. Para sites pequenos, geralmente há apenas um RequestID
e um CorrelationId
. Se você usar microsserviços, cada microsserviço gerará seu próprio arquivo RequestId
, mas CorrelationId
será 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_timeout
bem 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.