nginx 와 php - fpm 연결 시간 초과

6920 단어
현재 온라인 시스템 의 구 조 는 대체적으로 이 렇 습 니 다. cache 의 proxy 기 계 를 제외 하고 프로젝트 의 nginx proxy 기계 도 있 습 니 다. 그 다음 에 nginx webserver + phop - fpm 를 따라 갑 니 다.가끔 은 proxy nginx 의 로그 에 여러 가지 이상 상태 코드 가 있 습 니 다. 예 를 들 어 499, 502, 504 등 은 어떤 상황 으로 인 한 것 입 니까?최근 에 일일이 테스트 해 봤 는데
구성 표시
 nginx proxy => nginx webserver => php-fpm

상태 코드 설명
499:   (  proxy)      
502:    (Bad Gateway)
504:    :(Gateway Timeout)

1. proxy 와 웹 서버 는 연결 할 수 없습니다.
1.1 proxy_pass ip 없 음
이 때 arp 분석 프로 토 콜 을 반복 해서 보 냅 니 다. 약 3 초 후에 시간 이 초과 되 고 proxy 반환 코드 는 502 입 니 다.
1.2 proxy_pass ip 존재
1) 웹 서버 기기 의 포트 에 대응 하 는 서비스 가 없습니다.
웹 서버 가 있 는 기기 의 커 널 은 RESET 패키지 로 직접 돌아 갑 니 다. 추가 시간 초과 가 없 으 며 proxy 반환 코드 는 502 입 니 다.
2) 웹 서버 기기 포트 에 서비스 가 있 지만 iptables DROP 에 proxy 패키지 가 있 습 니 다.
웹 서버 drop iptables -I INPUT -s xxx.xxx.xxx.xxx -j DROP 이 proxy 패키지 이기 때문에 proxy 는 TCP 연결 을 계속 재 시도 합 니 다. 기본적으로 60 초 후에 proxy 반환 코드 504 를 다시 시도 합 니 다. 이 재 시도 시간 은 60 초 동안 매개 변수 proxy_connect_timeout 가 지정 합 니 다. 재 시도 간격 은 TCP 의 재 시도 간격 (1, 2, 4...) 입 니 다.
시간 이 초과 되 기 전에 클 라 이언 트 가 자발적으로 연결 을 닫 습 니 다 (예 를 들 어 브 라 우 저의 요청 을 중단 합 니 다). 이때 proxy 는 499 상태 코드 를 기록 하고 $request_time 는 proxy 가 처리 한 시간 을 기록 합 니 다. $upstream_response_time- 입 니 다.클 라 이언 트 가 자발적으로 닫 힌 후에 proxy 는 웹 서버 에 다시 시도 요청 을 보 내지 않 습 니 다.
그러나 프 록 시 설정 proxy_ignore_client_abort on; 을 사용 하면 클 라 이언 트 가 자발적으로 닫 더 라 도 프 록 시 는 웹 서버 에 재 시도 요청 을 보 냅 니 다. 시간 이 초과 되 었 을 때 까지 기 록 된 상태 코드 는 웹 서버 가 되 돌아 오 는 상태 코드 입 니 다.
3) 웹 서버 기기 포트 에 서비스 가 있 지만 iptables REJECT 는 proxy 패 키 지 를 만 들 었 습 니 다.
웹 서버 reject iptables -I INPUT -s xxx.xxx.xxx.xxx -j REJECT 가 proxy 가방 을 가지 고 있 기 때문에 drop 과 다른 점 은 이 럴 때 웹 서버 는 포트 에 도달 할 수 없 는 ICMP 가방 을 proxy 에 게 되 돌려 주 고 proxy 는 다시 시도 한 후에 502 클 라 이언 트 에 게 돌아 가 며 시간 초과 시간 은 약 1 초 입 니 다.
2. proxy 와 웹 서버 의 연결 이 정상 입 니 다 (요청 시간 이 너무 오래 걸 립 니 다)
proxy nginx.conf  proxy_read_timeout=60
webserver nginx.conf fastcgi_read_timeout=300
php-fpm   request_terminate_timeout=120

2.1 phop 실행 시간 이 proxy 를 초과 한 proxy_read_timeoutpp - fpm 에 test. php 실행 시간 이 100 초 라 고 가정 하면 기본 proxy_read_timeout=60; 을 초과 하면 1 분 후에 proxy 는 웹 서버 의 연결 을 닫 습 니 다. 웹 서버 가 기록 한 반환 코드 는 499 이 고 proxy 의 반환 코드 는 504 이 며 클 라 이언 트 가 본 반환 코드 는 504 입 니 다.proxy_read_timeout 에 대해 한 마디 더 해 야 합 니 다. nginx 문서 에서 이 매개 변 수 를 볼 수 있 는 의 미 는?
The timeout is set only between two successive read operations,
 not for the transmission of the whole response.

이 시간 초 과 는 전체 response 의 전송 시간 초과 가 아니 라 두 번 의 읽 기 작업 간 의 간격 초과 라 는 뜻 이다.예 를 들 어 proxy 에 설정 proxy_read_timeout=10 하고 테스트 한 test. php 는 다음 과 같 습 니 다.
";
ob_flush();
flush();
sleep(7);
echo "haha after 7s
"; ??>

이 전체 요청 의 응답 시간 은 14 초 입 니 다. 사실은 시간 을 초과 하지 않 습 니 다. 인접 한 두 번 의 읽 기 동작 간격 은 7 초 에서 10 초 이하 이기 때 문 입 니 다.코드 에 있 는 ob_flush()flush() 두 함수 에 주의 하 십시오. 그 중에서 ob_flush() 는 phop 의 캐 시 를 닦 기 위 한 것 이 고 flush() 는 시스템 차원 의 캐 시 를 닦 기 위 한 것 입 니 다.물론 /etc/php5/fpm/php.inioutput_buffering=off 를 설정 하면 호출 ob_flush() 을 하지 않 아 도 되 지만 flush() 은 필요 하 다.flush 가 아니라면 phop 은 전체 응답 이 완 료 될 때 까지 기 다 려 야 웹 서버 에 데 이 터 를 되 돌려 주 고 웹 서버 는 proxy 에 게 되 돌려 줍 니 다. 전체 응답 을 되 돌려 주지 않 기 전에 (14 초 만 에 되 돌려 줍 니 다) proxy 를 초과 합 니 다.read_timeout 의 10 초 동안 proxy 는 웹 서버 와 의 연결 을 닫 아 504 오류 가 발생 합 니 다.이 테스트 test. php 가 시간 을 초과 하지 않 기 위해 서 웹 서버 의 nginx 는 설정 fastcgi_buffering off; 을 추가 해 야 합 니 다. 비록 우리 의 phop 이 데 이 터 를 되 돌려 주 었 지만 웹 서버 의 nginx 는 fastcgi 의 반환 을 캐 시 하여 proxy 에 데 이 터 를 제때에 되 돌려 주지 않 아 시간 을 초과 하 였 습 니 다.
위 에서 설정 한 바 와 같이 브 라 우 저 출력 haha
haha after 7s
을 발견 할 수 있 습 니 다.문제 가 생 겼 습 니 다. 이 두 문자열 은 동시에 출력 되 었 습 니 다. 코드 처럼 7 초 걸 리 지 않 았 습 니 다. 이 문 제 는 무엇 때 문 입 니까?proxy nginx 에 도 캐 시 설정 이 있 습 니 다. 닫 아야 두 문자열 의 효 과 를 볼 수 있 습 니 다.nginx proxy 의 캐 시 설정 은 proxy_buffering off; 입 니 다. 그러면 두 문자열 을 연이어 출력 하 는 효 과 를 볼 수 있 습 니 다.
2.2 php 실행 시간 이 웹 서버 를 초과 한 경우 fastcgi_read_timeout설정 fastcgi_read_timeout=10, test. php 실행 시간 100 초, 10 초 후 웹 서버 는 PHP 와 의 연결 을 닫 습 니 다. 웹 서버 기록 로그 의 반환 코드 는 504 이 고 proxy 로그 의 반환 코드 도 504 입 니 다.
2.3 phop 실행 시간 이 phop - fpm 를 초과 한 request_terminate_timeout설정 request_terminate_timeout=5, test. php 또는 100 초 를 실행 합 니 다. 5 초 후에 phop - fpm 는 해당 하 는 phop 서브 프로 세 스 를 종료 합 니 다. 웹 서버 로그 의 상태 코드 는 404 이 고 proxy 로그 의 상태 코드 도 404 입 니 다.
주: 테스트 를 통 해 php - fpm 모드 에서 php. ini 의 max_execution_time 매개 변 수 는 아무런 효과 가 없습니다.
질문
리 눅 스 안의 일부 제한 매개 변 수 는 ulimit -a 을 통 해 볼 수 있다.예 를 들 어 제 debian 8.2 시스템 의 출력 은 다음 과 같 습 니 다.
# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 96537
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1000000
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 96537
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

그 중에서 open files 은 프로 세 스 가 동시에 열 수 있 는 파일 수 로 이 회의 보고 too many open files 를 초과 하고 수정 open filesulimit -n xxx 을 통 해 이 루어 질 수 있다.max user processes 은 사용자 가 가장 많이 만 든 프로 세 스 입 니 다.
또한 시스템 에서 열 수 있 는 최대 파일 수 는 설정 file-max 에 있 습 니 다.
# cat /proc/sys/fs/file-max
2471221

수정 file-max 하려 면 통과 할 수 있 습 니 다.
# sysctl -w fs.file-max=1000000

영구적 으로 유효 하 며, /etc/sysctl.conf 에 이 줄 에 가입 해 야 합 니 다.
fs.file-max=1000000

그리고 sysctl -p 효력 이 발생 한다.
사용자 에 게 파일 수 를 제한 하 는 것 과 같은 것 을 수정 할 수 있 습 니 다 /etc/security/limits.conf. 내용 형식 은 다음 과 같 습 니 다.
            

##      bob                 
## Example hard limit for max opened files
bob        hard nofile 4096
## Example soft limit for max opened files
bob        soft nofile 1024

nginx 설정 중의 worker_rlimit_nofileopen files 이 값 으로 설정 할 수 있 습 니 다.
참고 자료
  • http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_read_timeout
  • https://www.hitoy.org/php-output-buffer.html
  • 좋은 웹페이지 즐겨찾기