고양이 여름이의 지식채널

recv() failed (104 connection reset by peer) while reading response header from upstream 에러 정리 (nginx + php-fpm 환경) 본문

Programming/TroubleShooting

recv() failed (104 connection reset by peer) while reading response header from upstream 에러 정리 (nginx + php-fpm 환경)

썸머캣 2023. 2. 21. 22:57

REST API 개발도중...

curl로 웹훅을 전송 하는데 위와 같은 오류가 계속 발생하여.. 찾아본 해결책 정리함.

 

일단 상태은.

nginx, php-fpm 환경에서 curl 통신시..

 

recv() failed (104 connection reset by peer) while reading response header from upstream 에러 와 함께 http 502를 발생시키고 있다.


 

이 오류가 발생할 수 있는 몇 가지 이유.

  1. Nginx와 PHP-FPM 사이에 네트워크 문제
  2. PHP-FPM 설정 문제. 예를 들어 PHP-FPM이 동시 연결 요청 수를 제한하도록 설정된 경우
  3. 리소스 제한. 서버 메모리, CPU 또는 디스크 공간과 같은 리소스가 부족한 경우
  4. Nginx 또는 PHP-FPM의 버그로 인한 문제. 이것은 가능성이 적지만, 가능성이 없는 것은 아님.
  5. php의 opcache 모듈 문제

일단 나의 문제는 opcache 모듈 문제 같긴한데..

 

그래도 일반적인 해결방법을 정리함.

 

해결방법.

 

  • nginx 설정에서 HTTP 부분. fastcgi 버퍼 사이즈와 timeout  조정

php-fpm 에서 보내주는 처리 용량을 늘려주고 타임아웃 시간을 늘려주는 처리

server {
    ...
 
    # send PHP requests to fastcgi (uses spawn-fcgi)
    location ~ \.php$ {
        # zero-day exploit defense.
        try_files                       $uri =404;
 
        # PHP의 성능 향상 -> 없으면 추가해주도록 하자
        sendfile                        on;
        tcp_nopush                      off;
        keepalive_requests              0;
 
        # 프록시 버퍼 설정 - no 502 errors!
        proxy_buffer_size               128k;
        proxy_buffers                   4 256k;
        proxy_busy_buffers_size         256k;
 
        # fastcgi 버퍼 설정 - no 502 errors!
        fastcgi_buffering               on;
        fastcgi_buffer_size             16k;
        fastcgi_buffers                 16 16k;
 
        # timeout 설정 php.ini와 매칭되어야함 (should match php.ini)
        fastcgi_connect_timeout         600s;
        fastcgi_send_timeout            600s;
        fastcgi_read_timeout            600s;
 
        break;
    }
}

이렇게 설정하면 일반적인 오류는 전부 해결이 됨..

.

.

.

 

그런데 나는 처리가 되지 않았다.. 그래서

  • nginx의 keepalive_requests 값과 php의 pm.max_requests 값 매칭 시키기

keepalive_requests : 하나의 keep-alive 연결을 통해 처리할 수 있는 최대 요청 수

pm.max_requests : 하위 프로세스가 다시 생성되기 전에 실행해야 하는 요청 수, 타사 라이브러리의 메모리 누수를 해결하는 데 유용할 수 있음. 무한 요청 처리의 경우 '0'으로 지정. 기본값 '0'

 

::max_requests를 설정 안하고 처리하다보면 간혹 php서버가 죽는 경우가 있다고 한다..

하여  max_requests를 설정해 줘야한다고 한다.

-> php가 죽어서 recv() failed 에러가 발생 할 수도 있을 듯..

우선 값을 500정도로 설정하고 nginx의 keepalive_requests 값도 동일하게 변경해 주었다.

(참고. https://www.how7o.com/t/how-can-i-resolve-the-recv-failed-104-connection-reset-by-peer-error-in-nginx-with-fastcgi/165/2)

 

반응형

 

  • php opcache 모듈 설정.

opcache 모듈은 PHP 성능을 향상시키기 위해 컴파일된 PHP 코드를 메모리에 캐싱을 해주는 모듈인데.  이전 버전(?)의 PHP 스크립트를 캐싱하고 있다가, Nginx에서 들어오는 새 요청과 이전에 캐시된 스크립트  간의 충돌이 발생할수도 있다고 한다.

그래서 해결방법으로.. opcache를 사용하지 않는것을 권한다고 하는데.

 

현재 에러가 나고 있는 부분에 한해서만 opcache 비활성화 처리를 해보기로 했다.

 

php_ini를 직접 수정하는것도 있지만 ini_set나 .htaccess으로 설정 가능하게 되어있다.

## .htaccess
php_flag opcache.enable Off

##ini_set
<? ini_set('opcache.enable', '0'); ?>

이렇게 설정하고 테스트 하니 일단 에러는 나오지 않고 있지만 그래도 계속해서 테스트는 해봐야 할 것 같다.

 


 

 

 

PHP Trait 사용법과 예제

 

PHP Trait 사용법과 예제

PHP Traits은 개발자들이 상속을 사용하지 않고도 여러 클래스에 걸쳐 코드를 재사용할 수 있게 해주는 PHP의 강력한 기능입니다. 이번엔 PHP Traits가 무엇인지, 어떻게 작동하는지 설명하고 사용 방

summer-cat93.tistory.com

 

728x90
반응형
Comments