>백엔드 개발 >PHP 튜토리얼 >PHP-FPM과 Nginx 간의 통신 메커니즘 요약

PHP-FPM과 Nginx 간의 통신 메커니즘 요약

coldplay.xixi
coldplay.xixi앞으로
2020-08-28 17:29:122682검색

PHP-FPM과 Nginx 간의 통신 메커니즘 요약

【관련 학습 권장 사항: php 그래픽 튜토리얼

PHP-FPM 소개

CGI 프로토콜 및 FastCGI 프로토콜

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

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

PHP-FPM이란

PHP-FPM은 PHP-FastCGI 프로세스 관리자로 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 튜토리얼]

Nginx와 php-fpm의 조합

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

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

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

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

두 가지 방법의 차이점:

유닉스 소켓은 네트워크 프로토콜 스택을 거치지 않아도 되기 때문에 패키징할 필요도 없고, 압축 풀기, 체크섬 계산, 시퀀스 번호 및 응답 유지 관리 등을 수행하고 한 프로세스에서 다른 프로세스로 애플리케이션 계층 데이터를 복사하기만 하면 됩니다. 따라서 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

유닉스 소켓 방식을 사용하여 연결하는 경우 소켓 파일은 본질적으로 파일이므로 권한 제어 문제가 있으므로 nginx 프로세스의 권한과 php-fpm의 권한에 주의해야 합니다. 그렇지 않으면 허가 없이 접근하라는 메시지가 표시됩니다. (해당 구성 파일에 사용자를 설정하세요)

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

애플리케이션 내 선택

nginx와 php-fpm이 동일한 서버에서 실행 중이고 동시성이 높지 않은 경우(1000 이하) nginx와 php-fpm의 통신 효율성을 향상시키려면 unix 소켓을 선택하세요.
동시 업무가 많은 경우에는 로드 밸런싱, 커널 최적화 등 운영 및 유지 관리 방법을 통해 효율성을 유지하기 위해 보다 안정적인 TCP 소켓을 사용하는 것을 고려해 보세요.

동시성이 높지만 여전히 Unix 소켓을 사용하고 싶다면 다음 방법을 통해 Unix 소켓의 안정성을 향상시킬 수 있습니다.

1) sock 파일을 /dev/shm 디렉토리에 저장하세요. 메모리를 더 빠르게 읽고 쓸 수 있도록 이 디렉토리에 있는 메모리에 sock 파일을 저장하세요.

2) 백로그 개선

백로그 기본 비트 128, 1024, 이 값은 일반 QPS로 대체되며 구성은 다음과 같습니다.

nginx.conf 파일에서

server {
        listen 80 default backlog = 1024;
       }

php-fpm.conf 파일에서

listen.backlog = 1024

3) sock 파일과 php-fpm 인스턴스를 추가하세요

/dev/shm에 새 sock 파일을 생성하고 요청을 전달하세요. nginx의 업스트림 모듈을 통해 로드는 두 개의 sock 파일로 균형을 이루고 두 개의 sock 파일은 두 세트의 php-fpm 인스턴스에 매핑됩니다. ㅋㅋ

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

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