개발 꿀팁/PHP

Nginx와 PHP 인터랙티브 프로세스 + Nginx와 PHP 통신의 두 가지 방식

Jammie 2022. 7. 2. 11:52
반응형

1. Nginx와 PHP 상호 작용 과정의 7단계 진행(사용자의 동적 PHP 웹 접근 과정)

step1: 사용자가 HTTP 요청을 nginx 서버로 보냅니다.서버는 3번의 악수를 하고 TCP 접속을 한다)
step2:nginx는 사용자가 접근한 URI와 접미사를 기반으로 요청을 판단합니다.
step3: 두 번째 단계를 통해 사용자가 동적 콘텐츠를 요청하면 nginx가 요청한다는 것을 알 수 있다.fastcgi 클라이언트에 전달하여 fastcgi_pass를 통해 사용자의 요청을 php-fpm으로 보냅니다.
만약 사용자가 정적 자원에 접근한다면, 간단합니다. nginx는 사용자가 요청한 정적 자원에 직접 접근합니다.원본이 사용자에게 반환되었습니다.
step4:wrapper php-fpm이 넘어오라는 요청을 받은 wraper 새 스레드 호출 php 동적 프로그램 확인 서버를 생성합니다
step5:php는 쿼리 결과를 nginx로 반환합니다.
step6:nginx는 사용자에게 결과를 반환하는 응답 메시지를 만듭니다.
이것은 nginx의 한 종류일 뿐이며, 사용자가 요청한 것과 사용자에게 반환한 것은 비동기적으로 진행됩니다.사용자가 요청한 리소스를 nginx에서 중계했습니다. nginx는 동기화할 수 있습니다. 즉, 확인된 리소스를 서버가 직접 사용자에게 반환하는 것입니다.nginx에서 경유 한 번 안 해도 된다.4단계: fastcgi_pass가동적 리소스를 php-fpm에 주면 php-fpm이 php 스크립트 해석 서버의 wrapper에 리소스를 전달합니다.

즉: Nginx -> FastCGI -> php-fpm -> FastCGI Wrapper -> php 파서

CGI는 범용 게이트웨이 프로토콜이고 FastCGI는 프로세스에 상주하는 CGI 모드 프로그램이다.우리가 잘 아는 PHP-FPM의 풀네임은 PHP FastCGI Process Manager입니다. 즉, PHP-FPM은 사용자 구성을 통해 일련의 FastCGI 프로세스를 관리할 수 있습니다. 예를 들어 PHP-FPM 관리 하에 있는 어떤 FastCGI 프로세스가 중단되었습니다. PHP-FPM은 사용자 구성에 따라 보완을 재개할지 여부를 볼 것입니다. PHP-FPM은 관리기와 더 유사합니다. Nginx와 PHP를 연결하는 것은 FastCGI 프로세스입니다.

그림에서 FastCGI의 하위 CGI-앱은 PHP 프로그램이다.FastCGI의 상류는 Nginx로, 그들 사이에는 통신용 벡터, 즉 그림 속의 소켓이 있다.위의 그림 3의 프로필에서 fastcgi_pass는 사용자의 요청을 받은 후 Nginx에게 어디로 전송해야 하는지 알려주는 것입니다. 우리는 그림 3에서 로컬로 전송되는 socket 파일입니다. 여기서 fastcgi_pass는 HTTP 인터페이스 주소입니다(이것은 php-fpm.conf에서도 사용할 수 있습니다.. 위의 그림 5의 Pre-fork는 PHP-FPM의 기동에 대응하여 즉, PHP-FPM을 기동할 때 사용자 설정에 따라 많은 FastCGI Wrapper(FastCGI Wrapper)를 기동시킨다.

PHP는 SAPI용 웹서버를 제공해 확장 프로그래밍을 제공한다.그러나 이러한 방식은 웹서버를 독자적으로 개발한다면 SAPI를 학습하고 웹서버 프로그램에서 구현해야 한다는 것을 의미합니다.이는 당신의 웹서버가 PHP와 커플링되었음을 의미한다.결합을 해결하는 방법: CGI 프로토콜, 더 나은 방법은 상하 모두 호환 가능한 공통 규격을 갖는 것이다.그러면 CGI 프로토콜은 Nginx, PHP 모두 수용할 수 있는 하나의 방식이 되고 FastCGI가 상주하는 프로세스 모델이 다운스트림 프로그램을 만든다.높은 병발 가능성이 생겼다.

2. Nginx와 PHP의 두 가지 통신방식 -unix socket과 tcp socket

1,양자 Nginx 설정

유닉스 소켓

nginx 프로필에 php-fpm이 실행되는 pid 파일 주소를 기입해야 한다.

location ~ \.php$ {
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
}

tcp socket

nginx 프로필에 php-fpm에서 실행되는 ip 주소와 포트 번호를 기입해야 한다.

location ~ \.php$ {
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
}

2、양자의 비교

위의 사진을 보면 유닉스 소켓은 불필요한 TCP 오버헤드를 줄이고, TCP는 루프백을 거쳐야 하며, 임시 포트와 TCP 관련 자원을 신청해야 한다.하지만 유닉스 소켓이 높을 때는 불안정하고, 접속 수가 폭발할 때는 긴 시간 캐시가 많이 발생하며, 접속 지향 프로토콜이 뒷받침되지 않으면 빅데이터 패킷이 이상을 반환하지 않고 바로 오류가 발생할 수 있다.TCP와 같은 연결 지향적인 프로토콜은 통신의 정확성과 무결성을 다소 보장한다.

3. 선택권고: 동일한 서버에서 nginx와 php-fpm을 실행하고 동시접속량이 1000을 넘지 않는 경우, unix socket을 선택하면 로컬이기 때문에 일부 확인 작업(라우팅 등)을 피할 수 있으므로 더 빠르고 가벼워집니다. 높은 동시병행업무에 직면하게 되면 보다 신뢰성 있는 TCP 소켓을 사용하여 부하균형, 커널 최적화 등의 운용수단으로 효율을 유지할 것이다

반응형