원인
새롭게 단장한 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;
}
설정을 수정한 후 서버를 재시작하면 문제는 과연 해결됩니다
'개발 꿀팁 > PHP' 카테고리의 다른 글
php+mysql 구현 페이지: 이전 페이지, 다음 페이지 (0) | 2022.07.13 |
---|---|
PHP/HTML 혼서의 네 가지 방식 (0) | 2022.07.13 |
PHP 오류 표시 설정 및 보고 수준 설정 (0) | 2022.07.13 |
PHP 밑바닥을 탐구하다 (0) | 2022.07.13 |
PHP 쾌속 정거장 건설의 6가지 단계를 자세히 설명하다 (0) | 2022.07.12 |