개발 꿀팁/PHP

php 502 bad gateway 해결 방법

Jammie 2022. 7. 13. 14:11
반응형

원인
새롭게 단장한 LNMP 환경은 아무리 해도 코드가 안 빠져서 502 bad gateway를 계속 제시해 주었는데, 내가 먼저 바이두 이하를 찾았는데 역시 도모가 단번에 많은 네티즌들이 제공한 답을 찾아준 것 같다.다양한, 어떤 것은 타임아웃의 문제이고 어떤 것은 php가 작동하지 않는 문제였다.
프로그래머로서 체크하는 것이 필수 기능 중 하나인데 체크해보니 타임아웃이 아니었고, php도 정상적으로 작동했는데 왜 이런 문제가 생긴 것일까.php가 작동되지 않은 상태에서 내가 대담한 가설을 세운 것은 fast_cgi에 문제가 있는 것은 아닐까?대담한 가설이 생겼으니 조심해라증서의 과정이 끝났다.

조심스럽게 증거를 찾다.
먼저 이전 단락은 fast_cgi에 대한 설정 코드입니다

location ~* \.php$ {
        fastcgi_index   index.php;
        fastcgi_pass    127.0.0.1:9000;

        include           fastcgi_params;
        fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
    }

언뜻 보기에는 문제가 없는 것 같습니다. 어쨌든 인터넷에는 이런 사양이 천편일률적으로 설치되어 있습니다. 다음으로 netstat-tlnp | grep 9000을 사용하여 9000을 감청하는 프로그램을 선별해 보았습니다만, 예상외로 9000을 감청하지 않았습니다. 결과는 다음과 같습니다

(Not all processes could be identified, non-owned process info

여기까지는 거의 이미 사양에 노출되어 있을 확률이 높아서 NGINX 관련 사양 자료를 찾아보니
Nginx와 PHP-FPM의 프로세스 간 통신은 TCP와 UNIXD 두 가지 방식이 있다.오메인 소켓
이 중 TCP는 IP+포트로 서버에 걸쳐 있습니다. UNIX Domino.Socket은 경유하지 않는다.네트워크, Nginx와 PHP-FPM이 같은 서버에 있는 장면에서만 사용할 수 있습니다. 어떤 것이 PHP-FPM 구성에 따라 달라집니다.
방식1:
php-fpm.conf: listen = 127.0.0.1:9000
nginx.conf: fastcgi_pass 127.0.0.1:9000;
방식2:
php-fpm.conf: listen =/tmp/php-fpm.sock
nginx.conf: fastcgi_pass unix:/tmp/php-fpm.sock;
여기서 php-fpm.sock은 php-fpm에서 생성된 파일이며, 형식은 srw-rw--.

UNIX Domain Socket은 연고 관계가 없는 두 개의 프로세스에 사용할 수 있으며, 현재 널리 사용되고 있다.X 윈도 서버와 GUI 프로그램과 같은 IPC 메커니즘은 유닉스 도메인 소켓을 통해 통신한다.통신 방식은 네트워크상에서 전파되지 않고 시스템 커널에서 발생한다. UNIX Domain Socket과 긴 연결 모두 TCP 짧은 연결을 빈번하게 만들어 TIME_WAIT 연결 과다 문제를 피할 수 있다. 프로세스 간 통신에 대한 두 프로그램.UNIX Domain Socket의 프로세스는 TCP 계층까지 가지 않고 파일 형식, stream socket communication. TCP socket의 경우 IP 계층까지 걸어가야 합니다.서버에서 TCP 소켓이 더 많이 이동했다.

UNIX Domain 소켓:
Nginx <=> socket <=> PHP-FPM
TCP 소켓 (로컬 루프):
Nginx <=> socket <=> TCP/IP <=> socket <=P PHP-FPM
TCP 소켓(Nginx와 PHP-FPM은 서로 다른 서버에 있음):
Nginx <=> socket <=> TCP/IP <=> 물리층 <=> 길라우터 <=> 물리층 <=> TCP/IP <=> socket <=> PHP-FPM
이번에 문제가 된 이유는 제가 유닉스 도메인 소켓을 사용했기 때문입니다.x배치의 확실한 tcp 방식, 문제점을 알고 있는 이상 수정하는 것이 훨씬 편리합니다. 코드를 다음과 같이 수정합니다.

location ~* \.php$ {
        fastcgi_index   index.php;
        #fastcgi_pass    127.0.0.1:9000; TCP 방식 주석 삭제
        fastcgi_pass    unix:/dev/shm/php-cgi.sock;#사용하다UNIX Domain Socket
        include           fastcgi_params;
        fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
    }

설정을 수정한 후 서버를 재시작하면 문제는 과연 해결됩니다

반응형