Articles

NGINX502 게이트웨이 나쁜:PHP FPM

팁/nginx/502 나쁜 게이트웨이/php

편집자 주:php fpm 사용하는 용어”마스터를 설명하는”기본 과정입니다. Datadog 는이 용어를 사용하지 않습니다. 이 블로그 게시물에,우리는 것입니다 이것을”기본”를 제외하고 쉽게 파악할 수 있도록 하기 위해 인스턴스에서 우리는 참조해야 하며 특정 프로세스의 이름입니다.

이 게시물은 NGINX502 잘못된 게이트웨이 오류 문제 해결에 관한 시리즈의 일부입니다. PHP-FPM 을 사용하지 않는 경우 gunicorn 을 백엔드로 사용하여 nginx502s 문제 해결에 대한 다른 기사를 확인하십시오.

PHP-FASTCGI 프로세스 관리자(PHP-FPM)는 PHP 응용 프로그램에 대한 웹 서버 요청을 처리하기위한 데몬입니다. 프로덕션에서 PHP-FPM 은 종종 NGINX 웹 서버 뒤에 배포됩니다. NGINX 는 웹 요청을 프록시하고 PHP 응용 프로그램을 실행하는 PHP-FPM 작업자 프로세스에 전달합니다.

다이어그램의 흐름을 보여줍 요청하려면 브라우저에서 NGINX PHP-FPM 고 다시.

NGINX 을 반환합니다 502 나쁜 게이트웨이 오류할 수 없는 경우는 성공적으로 요청을 프록시 PHP-FPM 경우,또는 PHP-FPM 실패 응답합니다. 이 게시물을 검사하고의 몇 가지 일반적인 원인 502 오류를 NGINX/PHP-FPM 스택,그리고 우리는 것에 대한 지침을 제공한 정보를 찾을 수 있습니다를 해결하는 데 도움이 되는 이러한 오류가 있습니다.

탐색을 측정,기록 및 추적을 뒤 NGINX502 나쁜 게이트웨이를 사용하여 오류 datadog 에서.

어떤 원인 502s

이 섹션에서는,우리는 설명할 방법은 다음 조건을 일으킬 수 있습 NGINX 을 반환 502 오류가:

  • PHP-FPM 실행하지 않
  • NGINX 지 않을 수 있습니다 PHP-FPM
  • PHP-FPM 시간이 다 되어가고 있습니다

경우 NGINX 와 통신할 수 없 PHP-FPM 이러한 이유 때문에,그것으로 응답 502 오류가 주목,이에 접근 로그(/var/log/nginx/access.로그)이 예제와 같이:

액세스.log

사본
127.0.0.1 - - "GET / HTTP/1.1" 502 182 "-" "curl/7.58.0"

NGINX 의 접근 로그하지 않의 원인을 설명 502 오류가지만,당신이 상담할 수 있습니다 그 오류 로그(/var/log/nginx/오류가 있습니다.로그)자세히보기. 예를 들어,여기에서 해당 항목 NGINX 오류 로그를 보여주는 것의 원인 502 오류가는 존재하지 않을 가능성이 있기 때문에,PHP-FPM 가 실행되고 있지 않습니다. (다음 섹션에서는이 문제를 감지하고 수정하는 방법을 살펴 보겠습니다.)

오류.log

사본
2020/01/31 18:30:55 13617#13617: *557 connect() to unix:/run/php/php7.2-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.2-fpm.sock:", host: "localhost"

PHP-FPM 실행되지 않

참고:이 섹션은 프로세스가 포함되면 이름을 사용하는 용어”마스터입니다.”특정 프로세스를 언급 할 때를 제외하고이 기사에서는”기본”이라는 용어를 대신 사용합니다.

PHP-FPM 이 실행되지 않으면 NGINX 는 PHP 응용 프로그램에 도달하기위한 모든 요청에 대해 502 오류를 반환합니다. 502s 를보고 있다면 먼저 PHP-FPM 이 실행 중인지 확인하십시오. 예를 들어,리눅스 호스트에 사용할 수 있습니다ps다음과 같은 명령을 입력하십시오 하나를 찾을 실행 PHP-FPM 프로세스는:

사본
sudo ps aux | grep 'php'

PHP-FPM 을 구성하는 작업자 프로세스라고 하는 그룹에서 수 있습니다. 샘플 출력 아래에 보여줍니다 PHP-FPM 기본 프로세스가 실행되는 두 개의 작업자 프로세스에서의 기본 수영장(이름www):

사본
root 29852 0.0 2.2 435484 22396 ? Ssl 16:27 0:00 php-fpm: master process (/etc/php/7.2/fpm/php-fpm.conf)www-data 29873 0.0 1.5 438112 15220 ? Sl 16:27 0:00 php-fpm: pool wwwwww-data 29874 0.0 1.6 438112 16976 ? Sl 16:27 0:00 php-fpm: pool www

경우 출력의ps명령으로 표시되지 않 PHP-FPM 또는 기본 수영장 프로세스를 얻어야 합 PHP-FPM 실행하여 해결 502 오류가 있습니다.프로덕션 환경에서는 SYSTEMD 를 사용하여 PHP-FPM 을 서비스로 실행하는 것이 좋습니다. 이것을 만들 수 있습 PHP 응용 프로그램의 안정성과 확장성을 향상시키기 때문에,PHP-FPM 데몬이 자동으로 제공할 수 PHP 응용 프로그램을 사용하기 쉬운 서버를 시작할 때 또는 새 인스턴스가 시작됩니다. PHP-FPM 은 PHP 소스 코드에 포함되어 있으므로 PHP 를 구성 할 때 SYSTEMD 서비스로 PHP-FPM 을 추가 할 수 있습니다.

한 번 PHP-FPM 프로젝트 구성된 서비스로 사용할 수 있습니다 다음과 같은 명령한다는 것을 확인하는 자동으로 시작하면 서버가 시작되:

사본
sudo systemctl enable php7.2-fpm.service

다음에 사용할 수 있는list-unit-files명령하에 대한 정보를 참조하십시오 당신의 서비스:

사본
sudo systemctl list-unit-files | grep -E 'php*fpm'

On PHP7.2 는 서버가 PHP-FPM 설치된다(심지어 실행되고 있지 않은 경우),출력의 이 명령이 될 것입니다:

사본
php7.2-fpm.service enabled

하에 대한 정보를 참조하십시오 PHP-FPM 서비스는,다음과 같은 명령을 사용합니다.

사본
sudo systemctl is-active php7.2-fpm.service

이 명령을 반환해야 합 출력의active. 그렇지 않은 경우 다음과 같이 서비스를 시작할 수 있습니다:

사본
sudo service php7.2-fpm start

NGINX 에 액세스 할 수 없습니 socket

때 PHP-FPM 가 시작되면,그것은 하나 이상 생성 TCP 또는 유닉스 소켓 통신 NGINX 웹 서버에 있습니다. PHP-FPM 의 작업자 프로세스는 이러한 소켓을 사용하여 NGINX 의 요청을 수신합니다.

502 오류가 소켓 잘못 구성으로 인해 발생했는지 확인하려면 PHP-FPM 및 NGINX 가 동일한 소켓을 사용하도록 구성되어 있는지 확인하십시오. PHP-FPM 은 각 작업자 프로세스 풀에 대해 별도의 구성 파일을 사용합니다.이 파일은/etc/php/7.2/fpm/pool 에 있습니다.디/. 각 풀의 소켓은 풀의 구성 파일에서listenlistenmypool사용하는 유닉스 소켓에 위치한/실행/php/mypool.양말:

mypool.conf.

사본
listen = /run/php/mypool.sock

경우 NGINX 에 액세스할 수 없는 소켓을 위해 특정 수영장도 마련되어 있으며,결정할 수 있는 노동자 수영장에서 관련된 문제를 확인하여 어떤 소켓에서 이름 NGINX 오류 로그 항목입니다. 는 경우,예를 들어,PHP-FPM 실패했을 시작mypool자 수영장,NGINX 반환 502 와 오류 로그 항목은 다음을 포함할 것입니다:

오류가 있습니다.나는 이것이 내가 할 수있는 일이 아니라는 것을 알고 있지만,나는 내가 할 수있는 일을 알고 있다고 생각한다.conf 파일은 관련locationinclude지시문을 로드하는 일반적인 구성을 위한 정보를 PHP-FPM,그리고fastcgi_pass지시어로 지정하는 같은 유닉스 소켓 지명에 mypool.위의 conf 파일.

nginx.conf.

사본
location / { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/mypool.sock;}

유닉스 소켓는 유닉스 파일시스템 권한이 있습니다. PHP-FPM 풀의 구성 파일은 다음과 같이 소켓의 모드와 소유권을 지정합니다.

www.conf.

사본
listen.owner = www-datalisten.group = www-datalisten.mode = 0660

있는지 확인 이러한 권한을 허용할 사용자와 그룹은 실행하 NGINX 액세스 소켓에. 는 경우 권한에서 소켓이 잘못된 NGINX 로그인 502 오류에의 접근 로그와 같은 메시지가 아래와 같이에서 오류 로그:

오류가 있습니다.log

사본
2020/02/20 17:12:03 3059#3059: *4 connect() to unix:/run/php/mypool.sock failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/run/php/mypool.sock:", host: "localhost"

주는 기본값의listen.ownerlisten.group경기는 기본 소유자와 그룹은 실행하 NGINX 그리고listen.mode기본값 0660. 이러한 기본값을 사용하여 nginx 는 소켓에 액세스 할 수 있어야합니다.

PHP-FPM 이 TCP 소켓에서 수신 대기 중이면 풀 conifguration 의listen지시문은 아래 그림과 같이

www.conf.

사본
listen = 127.0.0.1:9000

에서와 마찬가지로 유닉스 소켓을 방지할 수 있습니다 502 오류에 의해 확인되는 위치의 이 소켓 경기에서 지정한 NGINX 구성이 있습니다.

PHP-FPM 시간이 다 되어가고 있습니다

응용 프로그램의 경우는 너무 오래 걸 응답하는 사용자가 자신이 경험하게 될 것입 제한 시간 오류가 있습니다. 풀 구성의request_terminate_timeout지시문(기본값 20 초)에 설정된 PHP-FPM 의 시간 초과가 NGINX 의 시간 초과(기본값 60 초)보다 작 으면 NGINX 는 502 오류로 응답합니다. 아래에 표시된 NGINX 오류 로그는 PHP—FPM 인 업스트림 프로세스가 유효한 응답을 보내기 전에 연결을 닫았 음을 나타냅니다. 즉,이것은 PHP-FPM 시간이 초과 될 때 표시되는 오류 로그입니다.

오류.log

사본
2020/02/20 17:17:12 3059#3059: *29 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/run/php/mypool.sock:", host: "localhost"

이 경우 PHP-FPM 로그(는 기본적으로 위치하고 있 at/var/log/php7.2-fpm.로그)는 추가 정보를 제공하는 상관 메시지를 보여줍니다.

php7.2-fpm.log

사본
 WARNING: child 2120, script '/var/www/html/index.php' (request: "GET /index.php") execution timed out (25.755070 sec), terminating

을 올릴 수 있습 PHP-FPM 의 제한 시간 설정을 편집하여 수영장의 구성 파일만을 일으킬 수 있는 또 다른 문제는:NGINX 시간 전에 응답을 받 PHP-FPM. 기본 NGINX 제한 시간은 60 초입니다; PHP-FPM 시간 초과를 60 초 이상으로 올린 경우 PHP 응용 프로그램이 시간 내에 응답하지 않으면 NGINX 가 504 게이트웨이 시간 초과 오류를 반환합니다. 당신은 또한 당신의 NGINX 타임 아웃을 제기하여이를 방지 할 수 있습니다. 아래 예에서,우리가 올 시간 초과 값의 90 초을 추가하여fastcgi_read_timeouthttp블록의/etc/nginx/nginx.나는 이것을 할 수 없다.이 변경 사항을 적용하기 위해 NGINX 구성을 다시로드하십시오.:

사본
nginx -s reload

다음을 결정하는 이유 PHP-FPM 시간 제한,당신은 로그를 수집 및 어플리케이션 성능 모니터링(APM)데이터 수 있는 공개 지연의 원인에서와 외부 응용 프로그램입니다.

를 수집하고 분석하는 로그

문제를 해결 응용 프로그램 오류를 수집할 수 있습니다 로그를 보낼 로그 관리 서비스입니다. 우리가 위에서 조사한 NGINX 로그 외에도 PHP 는 오류 및 귀하에게 가치가있을 수있는 다른 이벤트를 기록 할 수 있습니다. 자세한 내용은 PHP 로깅 가이드를 참조하십시오.

할 PHP 및 NGINX 로그에 로그 관리 서비스와 결합,로그에서 관련 기술과 같은 서버를 캐싱하고 데이터베이스를 분석할 수 있습에서 로그를 통해 귀하의 웹 스택에서는 단일 플랫폼입니다.

막대 그래프에서 datadog 에서 로그 분석을 시각화 PHP 및 NGINX 의 로그를 다른 상태와 같은 오류가,경고,그리고 정보.
Datadog 의 로그 분석은 상태별로 그룹화 된 여러 서비스의 로그를 보여줍니다.

수집 APM 데이터에서 당신의 웹 stack

APM 를 식별할 수 있습 병목 현상과 문제를 해결하,다음과 같 502 오류에 영향을 미치는 성능합니다. 아래 스크린 샷은 Datadog 에서 시각화 된 NGINX 의 APM 데이터를 보여줍니다. 요약 이 보기 요청을 볼륨 오류가 요금 및 대기 시간을 NGINX 기반 서비스의 도움을 조사하의 성능과 같은 문제를 502 오류가 있습니다.

보 NGINX 서비스에 datadog 에서 APM 포함 막대 그래프를 보여주는 볼륨의 요청과 오류,히스토그램을 보여주는 대기 시간 분포와 라인 그래프를 보여주는 지연 값을 통해 시간.

200OK

빨리할 수 있는 진단하고 해결하는 응용 프로그램의 502 오류,더 나은입니다. Datadog 를 사용하면 인프라 전반의 메트릭,추적,로그 및 네트워크 성능 데이터를 분석할 수 있습니다. 이미 Datadog 고객 인 경우 nginx,PHP-FPM 및 기타 400 개 이상의 기술 모니터링을 시작할 수 있습니다. 아직 Datadog 계정이없는 경우 14 일 무료 평가판에 가입하고 몇 분 안에 시작하십시오.