nginx 와 php - fpm 연결 시간 초과
구성 표시
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_timeout
pp - 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.ini
에 output_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 files
은 ulimit -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_nofile
는 open files
이 값 으로 설정 할 수 있 습 니 다.참고 자료
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.