고양이 여름이의 지식채널
recv() failed (104 connection reset by peer) while reading response header from upstream 에러 정리 (nginx + php-fpm 환경) 본문
recv() failed (104 connection reset by peer) while reading response header from upstream 에러 정리 (nginx + php-fpm 환경)
썸머캣 2023. 2. 21. 22:57REST API 개발도중...
curl로 웹훅을 전송 하는데 위와 같은 오류가 계속 발생하여.. 찾아본 해결책 정리함.
일단 상태은.
nginx, php-fpm 환경에서 curl 통신시..
recv() failed (104 connection reset by peer) while reading response header from upstream 에러 와 함께 http 502를 발생시키고 있다.
이 오류가 발생할 수 있는 몇 가지 이유.
- Nginx와 PHP-FPM 사이에 네트워크 문제
- PHP-FPM 설정 문제. 예를 들어 PHP-FPM이 동시 연결 요청 수를 제한하도록 설정된 경우
- 리소스 제한. 서버 메모리, CPU 또는 디스크 공간과 같은 리소스가 부족한 경우
- Nginx 또는 PHP-FPM의 버그로 인한 문제. 이것은 가능성이 적지만, 가능성이 없는 것은 아님.
- 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 값도 동일하게 변경해 주었다.
- 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 Traits은 개발자들이 상속을 사용하지 않고도 여러 클래스에 걸쳐 코드를 재사용할 수 있게 해주는 PHP의 강력한 기능입니다. 이번엔 PHP Traits가 무엇인지, 어떻게 작동하는지 설명하고 사용 방
summer-cat93.tistory.com