nginx 502 오류 원인 및 해결 방법

문장 출처
502 오류 정의: 게 이 트 웨 이 오류 입 니 다. 쉽게 말 하면 웹 서버 와 통신 에 실 패 했 습 니 다.
nginx 에 502 가 발생 한 데 는 여러 가지 이유 가 있 지만 대부분 자원 의 수량 이 부족 하 다 고 요약 할 수 있 습 니 다. 즉, 백 엔 드 PHP - fpm 처리 에 문제 가 있 습 니 다. nginx 는 정확 한 클 라 이언 트 요청 을 백 엔 드 의 pp - fpm 프로 세 스 에 보 냈 으 나 pp - fpm 프로 세 스 문제 로 인해 phop 코드 를 정확하게 분석 하지 못 하고 클 라 이언 트 에 502 오 류 를 되 돌려 주 었 습 니 다.
nginx + phop 에 502 bad gateway 가 나타 납 니 다. 일반적으로 이것 은 nginx 의 문제 가 아니 라 fastcgi 나 phop 의 문제 로 인해 발생 합 니 다. 흔히 볼 수 있 는 것 은 다음 과 같은 몇 가지 가 있 습 니 다.
  •  php. ini 의 memorylimit 이 너무 작 습 니 다 (개별 phop 프로그램 프로 세 스 가 큰 메모 리 를 사용 해 야 할 경우 주의해 야 합 니 다)
  • 1. php - fpm. conf 중 maxchildren 혹은 maxrequests  설정 이 불합리 하 다(작은 모임 설정 은 cgi 프로 세 스 처리 요청 이 충분 하지 않 기 때 문 입 니 다. 대 회 를 설정 한 후 응답 이 정상 일 때 도 있 고, 한참 기 다 려 야 응답 할 때 도 있 습 니 다. 일반적으로 children 은 메모리 에 따라 계산 합 니 다. 예 를 들 어 1G 설정 64, 2G 128 입 니 다. 이것 은 실제 상황 에 따라 자동 으로 조 정 됩 니 다. 또한 현재 PHP FastCGI 프로 세 스 수가 충분 한 지 확인 하 는 명령 은 netstat 입 니 다. -anpo |grep “php-cgi” | wc -l   실제 사 용 된 'FastCGI 프로 세 스 수' 가 미리 설 정 된 'FastCGI 프로 세 스 수' 에 가깝다 면 'FastCGI 프로 세 스 수' 가 부족 하고 커 져 야 한 다 는 뜻 이다.)
    1. nginx 오류 로 그 를 보 니 pstream 이 응답 을 읽 는 동안 너무 큰 헤 더 를 보 냈 습 니 다. headerfrom upstream 은 client head buffer, fastcgi buffer 를 검사 합 니 다. size 가 너무 작은 지 32K 로 설정 할 수 있 습 니 다.
    1. php 프로그램 이 너무 오래 실행 되 고 시간 이 초과 되 었 습 니 다. nginx 와 fastcgi 의 각종 timeout 설정 을 검사 합 니 다. (nginx 의 경우 fastcgi_connect_timeout 300;fastcgi_send_timeout 300  :fastcgi_read_timeout300; keepalive_timeout ;  php - fpm 의 request terminate timeout, php. ini 의 max execution time)
    1. pp - fpm 에 max requests 인자 가 있 습 니 다. ,이 매개 변 수 는 모든 children 이 최대 몇 개의 요청 을 처리 하면 닫 힌 다 는 것 을 가리 키 고 있 습 니 다. 대량 처리 요청 에서 이 값 을 너무 작 게 설정 하면 children 의 잦 은 자살 과 구축 으로 많은 시간 을 낭비 할 수 있 습 니 다. 모든 children 이 이 럴 때 자살 하 는 경우 재건 축 전에 children 이 요청 에 응 하지 않 아 502 가 발생 합 니 다. 。이 값 을 크게 설정 하거나 0 [무한] 으로 설정 할 수 있 습 니 다.
    만약 에 서버 의 병발 량 이 매우 크다 면 기 계 를 먼저 증가 한 다음 에 다음 과 같은 방식 으로 최적화 하면 더욱 좋 은 효 과 를 얻 을 수 있 습 니 다. 그러나 병발 이 크 지 않 지만 502 가 나타 나 면 보통 설정 문제, 스 크 립 트 시간 초과 문제 로 요약 할 수 있 습 니 다.
    1. php - fpm 프로 세 스 가 부족 합 니 다.
    netstat - napo | grep "php - fpm" | wc - l 을 사용 하여 현재 fastcgi 프로 세 스 개 수 를 보십시오. 만약 개수 가 conf 에서 설정 한 상한 선 에 가깝다 면 프로 세 스 수 를 높 여야 합 니 다.
    그러나 끊임없이 높 일 수 는 없다. 서버 메모리 상황 에 따라 php - fpm 하위 프로 세 스 수 를 100 이상 으로 조정 할 수 있 고 4G 메모리 서버 에 200 이면 된다.
    2. 리 눅 스 커 널 파일 개수 높이 기
    이 명령 을 사용 할 수 있 습 니 다 (루트 계 정 이 어야 합 니 다)
    echo 'ulimit -HSn 65536'>> /etc/profile
    
    echo 'ulimit -HSn 65536'>> /etc/rc.local
    
    source /etc/profile

    3. 스 크 립 트 실행 시간 초과
    스 크 립 트 가 어떤 이유 로 오랫동안 되 돌아 오지 않 기 를 기다 리 고 있어 서 새로운 요청 이 처리 되 지 않 으 면 다음 설정 을 적 절 히 줄 일 수 있 습 니 다.
    nginx. conf 는 주로 다음 과 같 습 니 다.
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;

    php - fpm. conf 에 다음 과 같 습 니 다.
    request_terminate_timeout =10s
    4. 캐 시 설정 이 작 음
    nginx. conf 로 설정 을 수정 하거나 추가 합 니 다.
    proxy_buffer_size 64k;
    proxy_buffers  512k;
    proxy_busy_buffers_size 128k;

    5. recv()failed (104: Connection reset by peer) while reading response header fromupstream
    가능 한 원인 은 기관실 네트워크 가 가방 을 잃 어 버 리 거나 기관실 에 하드웨어 방화벽 이 있어 도 메 인 이름 에 접근 하 는 것 을 금지 합 니 다.
    그러나 가장 중요 한 것 은 프로그램 에 시간 초과 설정 을 해 야 합 니 다. php - fpm 의 request terminate timeout 을 사용 하지 마 십시오.
    request terminate timeout = 0 으로 설정 하 는 것 이 좋 습 니 다.
    이 매개 변 수 는 phop 프로 세 스 를 직접 죽 이 고 phop 프로 세 스 를 다시 시작 하기 때문에 전단 nginx 는 104: Connection reset by peer 로 돌아 갑 니 다. 이 과정 은 매우 느 리 고 전체적인 느낌 은 사이트 가 매우 카드 로 느껴 집 니 다.
    May 01 10:50:58.044162[WARNING] [pool www] child 4074, script'/usr/local/nginx/html/quancha/sameip/detail.php' execution timed out(15.129933 sec), terminating
    May 01 10:50:58.045725 [WARNING] [pool www] child 4074 exited on signal 15SIGTERM after 90.227060 seconds from start
    May 01 10:50:58.046818 [NOTICE] [pool www] child 4082 started

    천만 가지 말 을 하 는데 가장 중요 한 것 은 프로그램 에서 시간 초 과 를 잘 제어 하 는 것 이다. gethostby name, curl, file get contents 등 함수 의 시간 초 과 를 설정 해 야 한다.
    다른 하 나 는 이 물건 은 사이트 의 상호작용 성 을 증가 시 켰 지만 많이 사용 하면 반응 이 느 려 집 니 다. 만약 에 사이트 가 시간 을 초과 하고 많이 사용 하면 닫 을 수 있 습 니 다.
    6. 자신 이 502 를 만 나 는 해결 방법:
    php 와 Nginx 를 늘 리 는 backlog 수 를 조정 합 니 다.
    PHP - FPM 고부 하 해결 방법 Posted on 2011/09/02
    여 기 는 phop - fpm 의 최적화 방법 만 소개 하 였 으 나 일반적인 상황 에서 nginx 와 조합 하여 사용 할 때 그 중의 하 나 를 단독으로 최적화 하면 역할 이 특별히 크 지 않 고 nginx 를 최적화 시 켜 야 합 니 다. nginx 의 방법 도 참고 해 야 합 니 다.http://blog.haohtml.com/archives/6213.위의 최적화 전과 최적화 후의 그림 은 앞 뒤 차이 가 매우 크다 는 것 을 알 수 있다.
    nginx 502 bad gateway 의 PHP - CGI (FASTCGI)
    NGINX 502 BAD GATEWAY 의 오류 가 자주 발생 했 습 니 다. 인터넷 의 튜 토리 얼 을 보 았 지만 아직 완전히 해결 되 지 않 았 습 니 다. 현재 제 가 정리 한 502 BAD GATEWAY 를 해결 하 는 방식 은 다음 과 같 습 니 다.
    1. 서버 의 성능 을 보고 php - fmp. conf 에 max children 의 값 을 추가 합 니 다.
    max children 은 PHP - FPM Pool 의 가장 큰 하위 프로 세 스 입 니 다. 서버 메모리 에 따라 그 수 치 를 결정 합 니 다. 현재 설 정 된 PHP - FPM Pool 에 10G 메모 리 를 주 려 고 한다 고 가정 하면 보통 하나의 PHP 요청 이 메모리 10M - 40M 을 차지 합 니 다. 사이트 마다 PHP 요청 에 따라 메모리 25m 를 사용 합 니 다. 이렇게 max children = 10G / 25m = 409 를 사용 합 니 다. 따라서 이 값 은 상황 에 따라 계산 할 수 있 습 니 다.
    max requests 는 모든 하위 프로 세 스 가 다시 태 어 나 기 전에 처리 하 는 요청 수 입 니 다. 기본 값 은 unlimited (기본 값 은 1024) 입 니 다. 작은 (예 를 들 어 500 정도) 를 설정 하면 메모리 유출 로 인 한 문 제 를 피 할 수 있 습 니 다.
    Nginx 프 록 시 프로 세 스, 비 즈 니스 서버 요청 데 이 터 를 로 컬 파일 에 캐 시 한 다음 요청 클 라 이언 트 에 파일 데 이 터 를 전송 합 니 다. 높 은 병렬 클 라 이언 트 요청 은 서버 파일 핸들 의 병렬 열 림 제한 을 요구 합 니 다. ulimit 명령 (ulimit - n) 을 사용 하여 Linux 시스템 파일 핸들 의 병렬 제한 을 볼 수 있 습 니 다. 기본 값 은 1024 입 니 다. 65535 로 변경 할 수 있 습 니 다.(2 의 16 차방, 이것 은 시스템 포트 의 한계 입 니 다). 수정 방법 은 시스템 파일 / etc / security / limits. conf 를 수정 하고 다음 과 같은 정 보 를 추가 하 며 시스템 을 다시 시작 하 는 것 입 니 다.
    soft   nofile  65535
    hard   nofile  65535

    그리고 Nginx 프로필 에서 파일 제한 및 연결 수 정 보 를 65535 로 변경 합 니 다.
    worker_rlimit_nofile 65535;
    
    events {
    
        use epoll;
    
        worker_connections  65535;
    
    }

     
    2. reload 매개 변 수 를 사용 하여 정시 에 phop - fpm 를 다시 불 러 옵 니 다. 이 주요 원인 은 phop 스 크 립 트 의 실행 시간 이 너무 길 어서 발생 한 것 입 니 다. phop - fpm 를 다시 불 러 오 는 것 은 이 문 제 를 근절 할 수 있 습 니 다. phop - cgi 스 크 립 트 가 대량의 메모 리 를 차지 하여 502 오류 가 발생 하 는 것 을 어떻게 철저히 해결 하 는 지 더 연구 할 필요 가 있 습 니 다. 현재 이 방법 은 좋 은 방법 입 니 다.PHP 스 크 립 트 실행 에 영향 을 줍 니 다.
    */10* * * * /usr/local/php/sbin/php-fpm reload

    = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 최적화 설정 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
     
    높 은 부하 사이트 에서 PHP - FPM 으로 FastCGI 를 관리 하면 다음 과 같은 기술 이 유용 할 수 있 습 니 다.)
  • Compile PHP’s modules as less as possible, the simple the best (fast);
    가능 한 한 PHP 모듈 을 적 게 설치 하 는 것 이 가장 간단 하 다 (빠르다).
  • Increas PHP FastCGI child number to 100 and even more.Sometime, 200 is OK! ( On 4GB memory server);
    PHP FastCGI 하위 프로 세 스 수 를 100 이상 으로 조정 하면 4G 메모리 서버 에 200 개 를 입력 할 수 있 습 니 다. 제 1g 테스트 기 는 64 개 를 켜 는 것 이 가장 좋 습 니 다. 압력 테스트 를 통 해 최 적 치 를 얻 는 것 을 권장 합 니 다.
  • Using SOCKET PHP FastCGI, and put into /dev/shm on Linux;
    socket 으로 FastCGI 를 연결 하면 Liux 운영 체 제 는 / dev / shm 에 넣 을 수 있 습 니 다. php - fpm. cnf 에 / tmp / nginx. socket 을 설정 하면 socket 으로 FastCGI 를 연결 할 수 있 습 니 다. / dev / shm 는 메모리 파일 시스템 이 므 로 메모리 에 넣 으 면 빠 를 것 입 니 다. 이때 도 nginx 의 설정 을 수정 하여 일치 해 야 합 니 다.
  • location~ .*/.(php|php5)?$
    
    {
    
    # Nginx FastCGI      TCP  UnixSocket。TCP        UnixSocket  , Unix Socket    TCP 。
    
    fastcgi_pass  unix:/tmp/php-cgi.sock;
    
    #fastcgi_pass  127.0.0.1:9000;
    
    fastcgi_index index.php;
    
    include fcgi.conf;
    
    }
  • Increase Linux “max open files”, using the following command(must be root):
  • # echo ‘ulimit -HSn 65536′>> /etc/profile
    
    # echo ‘ulimit -HSn 65536 >> /etc/rc.local
    
    # source /etc/profile 
  • Liux 커 널 에서 파일 을 여 는 수량 을 높이 고 이 명령 (루트 계 정 이 어야 함)
  • 을 사용 할 수 있 습 니 다.
    echo ‘ulimit -HSn 65536′ >> /etc/profile
    
    echo ‘ulimit -HSn 65536′ >> /etc/rc.local
    
    source /etc/profile 
    
     :    /etc/rc.local,  ulimit -SHn 51200 
  • Increase PHP-FPM open file description rlimit:
  • # vi /path/to/php-fpm.conf
    
    Find “1024”
    
    Change 1024 to 4096 or higher number.
    
    Restart PHP-FPM.
  • 증가 PHP-FPM 파일 설명자 의 제한 열기
  • # vi /path/to/php-fpm.conf
    
      
    
    “1024”
    
     1024   4096    

    PHP - FPM 을 다시 시작 합 니 다.
  • Using PHP code accelerator,e.g eAccelerator, XCache. And set “cache_dir” to /dev/shm on Linux.
    php 코드 가속 기 를 사용 합 니 다. 예 를 들 어 eAccelerator, XCache. Liux 플랫폼 에서 cache_dir 를 / dev / shm 로 가리 킬 수 있 습 니 다.
  • 좋은 웹페이지 즐겨찾기