>  기사  >  백엔드 개발  >  CGI, FastCGI 및 PHP-FPM 간의 관계 다이어그램

CGI, FastCGI 및 PHP-FPM 간의 관계 다이어그램

不言
不言원래의
2018-04-16 13:55:1415477검색

이 기사는 주로 CGI, FastCGI 및 PHP-FPM 간의 관계 다이어그램을 소개합니다. 이제는 모든 사람과 공유합니다. 기본


모듈 방식

  • CGI

  • FastCGI 소개

  • FastCGI에 대한 간략한 소개

  • FastCGI 작동 방식

    • PHP-FPM 소개

    • 요약

  • 참고 자료

  • LAMP/LNMP 서버를 구축할 때 PHP-FPM, FastCGI 및 CGI의 개념을 자주 접하게 됩니다. 이들에 대해 조금이라도 알면 고성능 서버를 구축하기 어려울 것이다. 다음으로 이러한 개념 간의 관계를 그래픽으로 설명하겠습니다.

    기본
  • 전체 웹사이트 아키텍처에서 웹 서버(예: Apache)는 콘텐츠 배포자일 뿐입니다. 예를 들어 클라이언트가 index.html을 요청하면 웹 서버는 파일 시스템에서 이 파일을 찾아 브라우저로 보냅니다. 여기에 배포되는 것은 정적 데이터입니다.

요청이 index.php인 경우 구성 파일에 따라 웹 서버는 이 파일이 정적 파일이 아니며 PHP 파서에서 처리해야 함을 인식하고 간단히 요청을 처리한 다음 전달합니다. PHP 파서에 전달합니다.

웹 서버가 index.php 요청을 받으면 PHP 파서인 해당 CGI 프로그램을 시작합니다. 다음으로 PHP 파서는 php.ini 파일을 구문 분석하고 실행 환경을 초기화한 다음 요청을 처리하고 처리된 결과를 CGI에서 지정한 형식으로 반환하고 프로세스를 종료하며 웹 서버는 결과를 브라우저에 반환합니다. 이것은 완전한 동적 PHP 웹 액세스 프로세스입니다. 다음에 이러한 개념을 소개하면 이해하기가 더 쉬울 것입니다.

CGI:

은 웹 서버와 웹 애플리케이션 간의 데이터 교환을 위한 프로토콜입니다.

  • FastCGI: CGI와 동일하며 통신 프로토콜이지만 CGI보다 효율성이 일부 최적화되어 있습니다. 마찬가지로 SCGI 프로토콜은 FastCGI와 유사합니다.

  • PHP-CGI: 은 웹 서버에서 제공하는 CGI 프로토콜에 대한 PHP(웹 애플리케이션)의 인터페이스 프로그램입니다.

  • PHP-FPM: 은 PHP(웹 애플리케이션)가 웹 서버에 제공하는 FastCGI 프로토콜용 인터페이스 프로그램이며 비교적 지능적인 작업 관리 기능도 제공합니다.

WEB에서

  • 웹 서버는 일반적으로 Apache, Nginx, IIS, Lighttpd, Tomcat 및 기타 서버를 의미하며,

  • 웹 응용 프로그램은 일반적으로 PHP, Java, Asp.net 및 기타 응용 프로그램을 의미합니다.

모듈 방식

CGI를 이해하기 전에 먼저 웹 서버가 데이터를 전송하는 또 다른 방식인 PHP 모듈 로딩 방식을 살펴보겠습니다. Apache를 예로 들어보겠습니다. PHP 모듈 모드에서 Apache의 구성 파일 httpd.conf에 다음 문장을 추가해야 합니다.

# 加入以下2句LoadModule php5_module D:/php/php5apache2_2.dllAddType application/x-httpd-php .php# 修改如下内容<IfModule dir_module>
    DirectoryIndex index.php index.html</IfModule>

위는 Windows에서 php 및 apache 환경을 설치한 후 수동 구성입니다. 대략 다음과 같이 구성됩니다:

# ./configure --with-mysql=/usr/local --with-apache=/usr/local/apache --enable-track-vars

따라서 이들의 공통 본질은 LoadModule을 사용하여 php5_module을 로드하는 것입니다. 이는 php를 Apache의 하위 모듈로 실행하는 것입니다. 웹을 통해 PHP 파일에 액세스할 때 Apache는 php5_module을 호출하여 PHP 코드를 구문 분석합니다.

그렇다면 php5_module은 PHP 코드를 구문 분석하기 위해 어떻게 데이터를 PHP 파서에 전달합니까? 대답은 sapi를 통해서입니다.

apache, php, sapi의 관계를 자세히 설명하기 위해 다른 그림을 살펴보겠습니다.

CGI, FastCGI 및 PHP-FPM 간의 관계 다이어그램

위 그림에서 sapi는 이러한 중간 프로세스이고 SAPI는 외부 통신을 제공하는 인터페이스라는 것을 알 수 있습니다. 소켓과 다소 유사하여 PHP가 다른 응용 프로그램(apache, nginx 등)과 상호 작용할 수 있습니다. PHP는 기본적으로 다양한 종류의 SAPI를 제공하며, 일반적인 SAPI로는 php5_module, CGI, Apache 및 nginx용 FastCGI, IIS용 ISAPI 및 Shell CLI가 있습니다.

그래서 위의 apache call php 실행 과정은 다음과 같습니다.

apache -> httpd -> php5_module -> sapi -> php

알겠습니다. php5_module을 통해 Apache와 PHP를 알아봅시다!

이 모드는 Apache에 PHP 모듈을 설치하므로 Apache가 요청을 종료할 때마다 프로세스가 생성되며 이 프로세스에는 PHP의 다양한 계산과 계산이 완전히 포함됩니다.

위 그림에서 apache가 요청을 받을 때마다 sapi를 통해 요청을 완료하기 위해 PHP에 연결하는 프로세스를 생성한다는 것을 분명히 알 수 있습니다. 서버가 이를 감당할 수 없게 됩니다.

또한 mod_php를 apache로 컴파일할 때 문제가 발생했을 때 php의 문제인지 apache의 문제인지 판단하기 어렵습니다.

CGI

CGI(Common Gateway Interface)는 "Common Gateway Interface"를 의미하며 웹 서버가 PHP 애플리케이션과 "대화"하는 도구이며 해당 프로그램은 네트워크 서버에서 실행되어야 합니다. . CGI는 언어에 표준 입력, 출력 및 환경 변수가 있는 한 어떤 언어로든 작성할 수 있습니다. php, perl, tcl 등이 있습니다.

웹 서버는 어떤 데이터를 PHP 파서에 전달하나요? URL, 쿼리 문자열, POST 데이터, HTTP 헤더가 모두 있을 것입니다. 따라서 CGI는 전송될 데이터와 요청 처리를 위해 백엔드에 전달되는 형식을 규정하는 프로토콜입니다. PHP 코드에 사용하는 사용자가 어디에서 왔는지 신중하게 생각해 보세요.

즉, CGI는 웹 서버를 다루는 데 특별히 사용됩니다. 웹 서버가 사용자 요청을 받으면 요청을 cgi 프로그램(예: php-cgi)에 제출합니다. cgi 프로그램은 요청에 제출된 매개변수에 따라 처리(php 구문 분석)한 다음 표준 html을 출력합니다. 명령문을 작성하여 웹 서버에 반환합니다. 웹 서버는 이를 클라이언트에 반환합니다. 이것이 일반적인 cgi 작동 방식입니다.

CGI의 장점은 서버와 완전히 독립적이며 중개자 역할만 한다는 것입니다. Apache 및 PHP에 대한 인터페이스를 제공합니다. CGI 배선을 통해 데이터 전송을 완료합니다. 이것의 장점은 둘 사이의 연관성을 최소화하고 더 독립적으로 만드는 것입니다.

하지만 CGI에는 문제가 있습니다. 즉, 모든 웹 요청에는 시작 및 종료 프로세스가 있는데, 이는 가장 비판적인 fork-and-execute 모드입니다. 죽을 것이다.

FastCGI 소개

FastCGI에 대한 간략한 소개

기본적으로 FastCGI는 CGI 프로그램의 성능을 향상시키는 데 사용됩니다. CGI와 마찬가지로 FastCGI도 프로토콜이라고 할 수 있습니다.

FastCGI는 장수 CGI와 같습니다. 활성화되어 있으면 매번 포크하는 데 시간이 걸리지 않습니다. 또한 분산 컴퓨팅을 지원합니다. 즉, FastCGI 프로그램은 웹 사이트 서버가 아닌 호스트에서 실행될 수 있으며 다른 웹 사이트 서버의 요청을 수락할 수 있습니다.

FastCGI는 언어 독립적이고 확장 가능한 아키텍처 CGI 개방형 확장입니다. 주요 동작은 CGI 인터프리터 프로세스를 메모리에 유지하여 더 높은 성능을 얻는 것입니다. 우리 모두 알고 있듯이 CGI 인터프리터의 반복적인 로딩은 CGI 성능이 저하되는 주된 이유입니다. CGI 인터프리터가 메모리에 남아 있고 FastCGI 프로세스 관리자 스케줄링을 허용한다면 우수한 성능, 확장성, 장애 조치 기능 등을 제공할 수 있습니다.

FastCGI 작동 원리

FastCGI 인터페이스 방식은 C/S 구조를 채택하여 HTTP 서버와 스크립트 파싱 서버를 분리하고 동시에 스크립트 파싱 서버에서 하나 이상의 스크립트 파싱 데몬을 시작할 수 있습니다. HTTP 서버가 동적 프로그램을 만날 때마다 실행을 위해 FastCGI 프로세스로 직접 전달된 다음 결과가 브라우저로 반환됩니다. 이 방법을 사용하면 HTTP 서버가 정적 요청을 독점적으로 처리하거나 동적 스크립트 서버의 결과를 클라이언트에 반환할 수 있으므로 전체 응용 프로그램 시스템의 성능이 크게 향상됩니다.

CGI, FastCGI 및 PHP-FPM 간의 관계 다이어그램

  1. 웹 서버가 시작될 때 FastCGI 프로세스 관리자(Apache 모듈 또는 IIS ISAPI 등)를 로드합니다.

  2. FastCGI 프로세스 관리자는 자체적으로 초기화되고 여러 CGI 인터프리터 프로세스를 시작합니다(여러 PHP를 구축할 수 있음). ) cgi) 웹 서버로부터의 연결을 기다립니다.

  3. 클라이언트 요청이 웹 서버에 도달하면 FastCGI 프로세스 관리자가 CGI 인터프리터를 선택하고 연결합니다. 웹 서버는 CGI 환경 변수와 표준 입력을 FastCGI 하위 프로세스 php-cgi로 보냅니다.

  4. FastCGI 하위 프로세스는 처리를 완료한 후 동일한 연결에서 표준 출력 및 오류 정보를 웹 서버로 반환합니다. FastCGI 하위 프로세스가 연결을 닫으면 요청이 처리됩니다. 그런 다음 FastCGI 하위 프로세스는 FastCGI 프로세스 관리자(웹 서버에서 실행)의 다음 연결을 기다리고 처리합니다. CGI 모드에서는 이 시점에서 php-cgi가 종료됩니다.

FastCGI 및 CGI 기능:

  1. CGI의 경우 모든 웹 요청 PHP는 php.ini를 다시 구문 분석하고, 모든 확장을 다시 로드하고, 모든 데이터 구조를 다시 초기화해야 합니다. FastCGI를 사용하면 이 모든 작업이 프로세스가 시작될 때 한 번만 발생합니다. 추가 보너스는 지속적인 데이터베이스 연결이 작동한다는 것입니다.

  2. FastCGI는 다중 프로세스이므로 CGI 다중 스레딩보다 더 많은 서버 메모리를 사용합니다. php-cgi 인터프리터는 프로세스당 7~25MB의 메모리를 사용합니다. 이 숫자에 50 또는 100을 곱하면 많은 양을 얻을 수 있습니다. 메모리. .

PHP-FPM 소개

PHP-FPM을 이해하려면 먼저 PHP-CGI에 대해 이야기해야 합니다.

PHP-CGI는 PHP로 구현된 내장형 FastCGI 관리자입니다. PHP의 공식 제품이지만 전혀 강력하지 않고 성능도 너무 낮으며 매우 번거롭고 비인격적입니다. 이는 주로 다음과 같습니다.

  1. php-cgi php.ini를 변경한 후. 구성을 완료하려면 php를 다시 시작해야 합니다. cgi만 새 php-ini를 적용할 수 있으며 원활하게 다시 시작할 수 없습니다.

  2. php-cgi 프로세스를 직접 종료하면 PHP가 실행될 수 없습니다.

위 두 가지 문제로 인해 오랫동안 많은 사람들이 고민을 했기 때문에 아직도 많은 사람들이 모듈 방식을 사용하고 있습니다. 2004년이 되어서야 Andrei Nigmatulin이라는 패자가 PHP-FPM을 발명했습니다. 이 아티팩트의 출현으로 이러한 상황이 완전히 깨졌습니다. 이것은 위의 두 가지 문제를 쉽게 극복했으며, 또한 더욱 강력해졌습니다. 다른 측면에서 성능.

즉, PHP-FPM은 FastCGI 프로토콜의 특정 구현입니다. 웹 서버의 요청을 처리하기 위해 프로세스 풀을 관리하는 역할을 합니다. 현재 PHP5.3 버전 이후에는 PHP-FPM이 PHP에 내장되어 있습니다.

PHP-CGI는 단지 CGI 프로그램이기 때문에 요청을 구문 분석하고 결과를 반환할 수만 있을 뿐 프로세스 관리는 모릅니다. 따라서 lighthttpd에서 분리된spawn-fcgi와 같이 php-cgi 프로세스를 예약할 수 있는 일부 프로그램이 있었습니다. 마찬가지로 PHP-FPM은 PHP 파서 php-cgi를 예약하고 관리하는 데 사용되는 관리 프로그램이기도 합니다.

PHP-FPM은 새로운 하위 프로세스를 생성하여 php.ini 수정 후 원활한 재시작을 달성할 수 있습니다.

요약

마지막으로 이러한 기술이 지속적인 업그레이드 후에 어떤 문제를 해결할 수 있는지 요약해 보겠습니다(그렇지 않으면 업그레이드되지 않습니다).

그래서 고성능 PHP WEB 서버를 구축하고 싶다면 현재 가장 좋은 방법은 Apache/Nginx + FastCGI + PHP-FPM(+PHP-CGI)입니다. 방법, 더 이상 모듈 로딩이나 CGI 방법을 사용하지 마세요 :)

이 글의 사진은 Visio로 제작되었습니다. 소스 파일: php-fpm

원본 주소: https://www.awaimai.com/ 371.html

관련 권장 사항:

PHP7 커널 분석 1 CGI 및 FastCGI

CGI, FastCGI 및 PHP_FPM의 관계는 무엇입니까?

위 내용은 CGI, FastCGI 및 PHP-FPM 간의 관계 다이어그램의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.