Nginx 에서 502 와 504 오류 가 발생 했 습 니 다.

3310 단어
Nginx 에서 502 와 504 오류 가 발생 했 습 니 다.
본문https://segmentfault.com/a/1190000002686153
Nginx 를 사용 할 때 502 Bad Gateway 와 504 Gateway Time - out 오류 가 자주 발생 합 니 다. 다음은 Nginx + PHP - FPM 으로 이 두 가지 흔 한 오류 의 원인 과 해결 방안 을 분석 해 보 겠 습 니 다.
1. 502 잘못된 게 이 트 웨 이 오류
php. ini 와 php - fpm. conf 에는 각각 두 가지 설정 항목 이 있 습 니 다: maxexecution_time 과 requestterminate_timeout。
이 두 항목 은 모두 PHP 스 크 립 트 의 최대 실행 시간 을 설정 하 는 데 사 용 됩 니 다.이 시간 이 지나 면 PHP - FPM 은 스 크 립 트 의 실행 을 중지 할 뿐만 아니 라 스 크 립 트 를 실행 하 는 Worker 프로 세 스 도 종료 합 니 다.그래서 Nginx 는 자신 과 통신 하 는 연결 이 끊 어 진 것 을 발견 하고 클 라 이언 트 502 오류 로 돌아 갑 니 다.
PHP - FPM 으로 requestterminate_timeout = 30 초의 경우 502 Bad Gateway 의 오 류 를 알 리 는 구체 적 인 정 보 는 다음 과 같 습 니 다.
1) Nginx 오류 접근 로그:
2013/09/19 01:09:00 [error] 27600#0: *78887 recv() failed (104: Connection reset by peer) while reading response header from upstream, 
client: 192.168.1.101, server: test.com, request: "POST /index.php HTTP/1.1", upstream: "fastcgi://unix:/dev/shm/php-fcgi.sock:", 
host: "test.com", referrer: "http://test.com/index.php"

2) PHP - FPM 오류 로그:
WARNING: child 25708 exited on signal 15 (SIGTERM) after 2100.883410 seconds from start 때문에 이 두 항목 의 값 을 조금 만 크게 조정 하면 PHP 스 크 립 트 가 오래 실행 되 었 다 고 해서 종료 되 지 않 습 니 다.request_terminate_timeout 는 max 를 덮어 쓸 수 있 습 니 다.execution_time, 그래서 전체적인 php. ini 를 바 꾸 지 않 으 려 면 PHP - FPM 설정 만 바 꾸 면 됩 니 다.
그리고 주의해 야 할 것 은 Nginx 의 upstream 모듈 중의 max 입 니 다.fail 과 fail타임 아웃 두 가지.때때로 Nginx 와 상위 서버 (예 를 들 어 Tomcat, FastCGI) 의 통신 은 우연히 끊 겼 지만 maxfail 설정 이 작 으 면 다음 fail타임 아웃 시간 내 에 Nginx 는 상위 서버 가 끊 겼 다 고 생각 하고 502 오 류 를 되 돌려 줍 니 다.그래서 maxfail 을 크게 조정 하면 fail타임 아웃 좀 줄 여.
2. 504 Gateway 타임 아웃 오류
PHP - FPM 이 설정 한 스 크 립 트 의 최대 실행 시간 은 충분 하지만, PHP 스 크 립 트 를 실행 하 는 데 시간 이 걸 렸 을 때, Nginx 오류 가 502 에서 504 로 변 한 것 을 발견 하 였 습 니 다.왜 그 럴 까요?
PHP 설정 만 수 정 했 기 때문에 Nginx 에 도 상위 서버 와 의 통신 시간 초과 설정 이 있 습 니 다 factcgiconnect/read/send_timeout。
Nginx 시간 초과 90 초, PHP - FPM 시간 초과 300 초의 경우 504 Gateway Timeout 오 류 를 보고 한 Nginx 오류 접근 로 그 는 다음 과 같 습 니 다.
 2013/09/19 00:55:51 [error] 27600#0: *78877 upstream timed out (110: Connection timed out) while reading response header from upstream, 
 client: 192.168.1.101, server: test.com, request: "POST /index.php HTTP/1.1", upstream: "fastcgi://unix:/dev/shm/php-fcgi.sock:", 
 host: "test.com", referrer: "http://test.com/index.php"

이 세 항목 의 값 (주로 read 와 send 두 항목, 기본적으로 설정 하지 않 으 면 Nginx 는 시간 초과 시간 을 60 초 로 설정 합 니 다) 을 올 린 후 504 오류 도 해결 되 었 습 니 다.
그리고 이 세 가지 설정 은 http, server 단계 에 설정 할 수도 있 고 location 단계 에 설정 할 수도 있 습 니 다.다른 애플 리 케 이 션 에 영향 을 미 칠 까 봐 자신 이 사용 하 는 location 에 설정 하 세 요.
주의해 야 할 것 은 factcgiconnect/read/send_timeout 은 FastCGI 에 적용 되 며 proxyconnect/read/send_timeout 은 proxy패스 는 효력 이 발생 합 니 다.
설정 예:
location ~ \.php$ {
    root                    /home/cdai/test.com;
    include                 fastcgi_params;
    fastcgi_connect_timeout      180;
    fastcgi_read_timeout            600;
    fastcgi_send_timeout            600;
    fastcgi_pass            unix:/dev/shm/php-fcgi.sock;
    fastcgi_index           index.php;
    fastcgi_param          SCRIPT_FILENAME         /home/cdai/test.com$fastcgi_script_name;
}

좋은 웹페이지 즐겨찾기