>  기사  >  백엔드 개발  >  PHP-FPM과 Nginx 간의 통신 메커니즘 소개(예제 포함)

PHP-FPM과 Nginx 간의 통신 메커니즘 소개(예제 포함)

不言
不言앞으로
2019-01-29 11:04:402603검색

이 글은 PHP-FPM과 Nginx 사이의 통신 메커니즘을 소개합니다(예제 포함). 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

PHP-FPM 소개

  • CGI 프로토콜과 FastCGI 프로토콜

각 동적 언어(PHP, Python 등)의 코드 파일은 해당 파서를 통과해야 서버에서 인식할 수 있으며, CGI 프로토콜은 인터프리터와 서버가 서로 통신할 수 있도록 하는 데 사용됩니다. 서버에서 PHP 파일을 구문 분석하려면 서버가 PHP 파일을 구문 분석할 수 있도록 해당 CGI 프로토콜과 결합된 PHP 인터프리터를 사용해야 합니다.

CGI의 메커니즘은 요청이 처리될 때마다 CGI 프로세스를 포크하고 요청이 완료된 후 프로세스를 종료해야 하는데 이는 실제 응용 프로그램에서는 자원 낭비이기 때문에 CGI의 향상된 버전인 FastCGI가 등장했습니다. 요청이 처리된 후 FastCGI 프로세스는 종료되지 않지만 계속해서 여러 요청을 처리하므로 효율성이 크게 향상됩니다.

  • PHP-FPM이란

PHP-FPM은 FastCGI를 구현한 프로세스 관리 기능입니다. 프로세스에는 마스터 프로세스와 작업자 프로세스의 두 가지 유형이 포함됩니다. 포트를 수신하고 서버에서 요청을 수신하는 마스터 프로세스는 하나만 있지만 일반적으로 여러 작업자 프로세스가 있습니다(특정 개수는 실제 프로세스에 따라 구성됩니다). 필요), 각 프로세스에는 내부에 하나의 코드가 내장되어 있습니다. PHP 인터프리터는 코드가 실제로 실행되는 곳입니다.

Nginx 및 php-fpm 통신 메커니즘

웹사이트(예: www.test.com)를 방문할 때 처리 흐름은 다음과 같습니다.

  www.test.com
        |
        |
      Nginx
        |
        |
路由到www.test.com/index.php
        |
        |
加载nginx的fast-cgi模块
        |
        |
fast-cgi监听127.0.0.1:9000地址
        |
        |
www.test.com/index.php请求到达127.0.0.1:9000
        |
        |
     等待处理...
  • Nginx와 php-fpm

Linux에는 Nginx와 php-fpm 사이에 통신하는 방법이 두 가지 있습니다: tcp와 unix 소켓.

tcp의 장점은 서버 전반에 걸쳐 사용할 수 있다는 것입니다. 이 방법은 Nginx와 PHP-fpm이 동일한 시스템에 있지 않은 경우에만 사용할 수 있습니다.

IPC(프로세스 간 통신) 소켓이라고도 하는 Unix 소켓은 동일한 호스트에서 프로세스 간 통신을 구현하는 데 사용됩니다. 이 방법을 사용하려면 nginx 구성 파일에 php-fpm의 소켓 파일 위치를 채워야 합니다.

두 가지 방법의 데이터 전송 과정은 아래 그림과 같습니다.

PHP-FPM과 Nginx 간의 통신 메커니즘 소개(예제 포함)

두 방법의 차이점:

유닉스 소켓은 네트워크 프로토콜 스택을 거치지 않기 때문에, 그럴 필요가 없습니다. 압축 및 압축 풀기, 체크섬 계산, 시퀀스 번호 및 응답 유지 관리 등을 수행하고 한 프로세스에서 다른 프로세스로 애플리케이션 계층 데이터를 복사하기만 하면 됩니다. 따라서 tcp보다 효율성이 높아 불필요한 tcp 오버헤드를 줄일 수 있습니다. 그러나 동시성이 높을 때 Unix 소켓은 불안정합니다. 연결 지향 프로토콜을 지원하지 않으면 대량의 장기 캐시가 생성됩니다. 예외. TCP와 같은 연결 지향 프로토콜은 통신의 정확성과 무결성을 더 잘 보장할 수 있습니다.

Nginx와 php-fpm을 결합하려면 해당 구성 파일에서 설정만 지정하면 됩니다.

1) Nginx의 구성

tcp 통신을 예로 들어

server {
    listen       80; #监听80端口,接收http请求
    server_name  www.test.com; #就是网站地址
    root /usr/local/etc/nginx/www/huxintong_admin; # 准备存放代码工程的路径
    #路由到网站根目录www.test.com时候的处理
    location / {
        index index.php; #跳转到www.test.com/index.php
        autoindex on;
    }   

    #当请求网站下php文件的时候,反向代理到php-fpm
    location ~ \.php$ {
        include /usr/local/etc/nginx/fastcgi.conf; #加载nginx的fastcgi模块
        fastcgi_intercept_errors on;
        fastcgi_pass   127.0.0.1:9000; # tcp 方式,PHP-fpm 监听的IP地址和端口
       # fasrcgi_pass /usr/run/php-fpm.sock # unix socket 连接方式
    }

}

2) php-fpm 구성

listen = 127.0.0.1:9000
# 或者下面这样
listen = /var/run/php-fpm.sock
참고로 Unix 소켓을 사용하여 연결하는 경우 소켓 파일은 본질적으로 파일이므로 권한 제어에 문제가 있으므로 Nginx 프로세스의 권한과 php-fpm의 권한에 주의해야 합니다. 허가 없이 접근하라는 메시지가 표시됩니다. (해당 구성 파일에 사용자를 설정하세요)

위 구성을 통해 php-fpm과 Nginx 간의 통신을 완료할 수 있습니다.

위 내용은 PHP-FPM과 Nginx 간의 통신 메커니즘 소개(예제 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제