NGINX+PHP-FPM: php-fpm PID를 연결하여 로그 항목에 액세스할 수 있습니까?

NGINX+PHP-FPM: php-fpm PID를 연결하여 로그 항목에 액세스할 수 있습니까?

우리는 NGINX와 php-fpm을 사용해 왔습니다.

일부 요청이 오랫동안(10분 이상, 20분 이상...) 중단되는 것을 확인했습니다.맨 위명령.
또한 일부 의심스러운 요청(봇을 의미함)이 액세스 로그 항목(NGINX)에서 감지되었지만 이러한 의심스러운 요청이 정지된 요청과 관련이 있는지 확실하지 않습니다.

그래서 내 주요 질문은 다음과 같습니다.

구성 등을 통해 php-fpm PID를 액세스 로그의 URL 항목에 연결할 수 있습니까?
아니면 이 작업에 도움이 될 수 있는 도구가 있나요?

추가 정보:
우리는 주요 개발자이기 때문에 소스 코드를 가지고 있습니다.

미리 감사드립니다!

답변1

스레드는 말할 것도 없고 기본적으로 Unix 소켓이나 TCP 소켓을 통해 블랙박스와 통신하기 때문에 nginx 측에서 올바른 php-fpm 프로세스를 식별하는 것은 문제가 됩니다.

PHP 측에서 문제를 공격할 수 있습니다. PHP 스크립트에서 getmypid()를 사용할 수 있습니다. 또는 이것이 코드가 아닌 경우 php fpm 구성에서 php_value auto_prepend_file 옵션을 사용할 수 있습니다. 이렇게 하면 모든 PHP 파일의 시작 부분에 자신만의 코드를 삽입하고 원하는 대로 해당 REQUEST_URI와 함께 pid를 기록할 수 있습니다. 원하는 연결이 이루어졌습니다. 바쁜 사이트에서는 대규모 IOP를 준비하세요.

pid만 필요한 경우 여기에 설명된 대로 php-status를 활성화하는 것이 더 쉬울 수 있습니다.https://easyengine.io/tutorials/php/fpm-status-page/그리고 yourserver/php-status?full을 확인하세요.

답변2

일반적으로 이런 종류의 문제는 소위 RequestId 단순히 두 개의 헤더를 설정하고 X-REQUEST-ID이를 X-CORRELATION-IDnginx와 PHP 측의 로그에 추가하는 방법을 사용하여 처리됩니다.

RequestId각 요청 시작 시 임의의 값(UUID 사용)으로 설정되어야 하며 CorrelationId각 사용자 상호 작용 시 임의의 값으로 설정되어야 합니다. 소규모 웹사이트의 경우 일반적으로 1 RequestID과 1 만 있습니다 CorrelationId. 마이크로서비스를 사용하는 경우 각 마이크로서비스는 자체적으로 생성되지만 마이크로서비스 RequestId간에 CorrelationId공유됩니다.

구현은 인프라에 따라 다르지만 간단한 구현은 다음과 같습니다.

# 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

그런 다음 PHP에 pid를 기록하기만 하면 됩니다.

# 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);
...

답변3

php-fpm 상태 페이지가 활성화된 경우 전체 모드를 확인하여 PID를 추적하는 것을 고려할 수 있습니다. 예를 들어,http://example.com/phpfpm-status?full무슨 일이 일어나고 있는지 알아낼 수 있어야합니다. (보안 관련 참고 사항: 이러한 상태 페이지를 공개적으로 액세스할 수 있도록 남겨두어서는 안 됩니다.)

답변4

PHP-FPM의 느린 로그를 활용해야 합니다: 설정 request_slowlog_timeoutslowlog- 참조php-fpm 구성 문서- 오랫동안 실행되는 모든 php-fpm 프로세스의 스택 추적을 제공해야 합니다. PID를 포함합니다.

관련 정보