목차
Web服务器与程序解析器运行流程(Nginx与php-fpm通信机制(通信流程))
配置示例
운영 및 유지보수 엔진스 Nginx와 php-fpm 간의 통신 메커니즘을 간략하게 분석한 기사

Nginx와 php-fpm 간의 통신 메커니즘을 간략하게 분석한 기사

Mar 11, 2022 am 11:11 AM
nginx php 통신 메커니즘

이 기사는 Nginx와 php-fpm 간의 통신 메커니즘에 대해 설명합니다. 모든 사람에게 도움이 되기를 바랍니다.

Nginx와 php-fpm 간의 통신 메커니즘을 간략하게 분석한 기사

CGI란?

Fastcgi에 대해 이야기하기 전에 먼저 CGI에 대해 이야기해야 합니다. CGI는 웹 서버가 전달하는 데이터가 표준 형식인지 확인하는 것입니다. 각 동적 언어(PHP, Python 등)의 코드 파일은 해당 파서를 통과해야 서버에서 인식되며 CGI 프로토콜을 사용하여 인터프리터와 서버가 서로 통신할 수 있습니다. 서버에서 PHP 파일을 구문 분석하려면 서버가 PHP 파일을 구문 분석할 수 있도록 해당 CGI 프로토콜과 결합된 PHP 인터프리터를 사용해야 합니다.

Nginx와 php-fpm 간의 통신 메커니즘을 간략하게 분석한 기사

1. 사용자는 www.baidu.com과 같은 클라이언트(브라우저)를 통해 URL을 입력합니다.

2. 브라우저는 일련의 과정을 거쳐(여기서는 과정 생략) 해당 서버를 요청합니다.

3. 서버 네트워크 카드는 모니터링되는 포트를 기반으로 해당 소프트웨어 서비스에 요청을 보냅니다.

4. 웹 서버(Nginx/Apache와 같은 웹 소프트웨어)는 요청을 받은 후 fast-cgi 또는 cgi 프로토콜을 통해 php-fpm 프로세스 관리자에게 요청 데이터를 전달합니다. php-fpm은 아래의 유휴 작업 프로세스에 작업을 보냅니다. 이때 작업 프로세스의 PHP 인터프리터가 파일 처리를 시작합니다.

5. PHP 인터프리터는 이를 처리하고 변환된 데이터를 fast-cgi 또는 cgi 프로토콜을 통해 웹 서버에 반환하고, 웹 서버는 클라이언트에 응답합니다.

FastCGI란 무엇인가요?

Fastcgi는 CGI의 고급 방식으로 CGI 프로그램의 성능을 향상시키는 데 사용됩니다. CGI 메커니즘에서는 각 요청을 처리해야 하기 때문에 CGI 프로세스를 분기해야 하며 요청이 완료된 후 프로세스가 종료됩니다. 이는 실제 응용 프로그램에서 리소스를 낭비하는 것입니다. 따라서 CGI의 향상된 버전인 FastCGI입니다. , 요청이 처리된 후 FastCGI는 프로세스를 종료하지 않고 계속해서 여러 요청을 처리하므로 효율성이 크게 향상됩니다.

Nginx와 php-fpm 간의 통신 메커니즘을 간략하게 분석한 기사

php-fpm이란?

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

  • 동시에 구성 파일을 적용하려면 php-cgi 프로그램을 다시 시작해야 합니다. , php-cgi는 원활한 재시작을 지원할 수 없습니다.

  • php-cgi 프로그램을 종료할 때는 다시 시작해야 합니다. 그렇지 않으면 PHP가 제대로 작동하지 않습니다. ㅋㅋㅋ -cgi 프로세스. PHP-FPM은 이제 PHP 커널에 통합되었습니다. --enalbe-fpm 컴파일 매개변수만 사용하면 됩니다. 또한, php.ini 구성 파일을 수정한 후에는 원활하게 재시작할 수 있는 방법이 없습니다. 이때 새 포크의 작업자는 새 구성을 사용하고 기존 작업자는 계속해서 작업을 완료합니다.

    Web服务器与程序解析器运行流程(Nginx与php-fpm通信机制(通信流程))

    web server(如nginx)只是内容的分发者。比如,如果请求/index.html,那么web server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态资源。如果现在请求的是/index.php,根据配置文件,nginx知道这个不是静态文件,需要去找PHP解析器来处理,那么他会把这个请求简单处理后交给PHP解析器。此时CGI便是规定了要传什么数据/以什么格式传输给php解析器的协议。当web server收到/index.php这个请求后,会启动对应的CGI程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以CGI规定的格式返回处理后的结果,退出进程。

    CGI与FastCGI相比较

    两者的主要差距在于性能瓶颈。前者接受到一个请求就会fork一个进程,后者则是事先启动一部分的worker进程。

    CGI工作原理

    CGI针对每个http请求都是fork一个新进程来进行处理,接着读取php.ini文件配置信息,初始化执行环境等。

    2.然后这个进程会把处理完的数据返回给web服务器,最后web服务器把内容发送给用户。

    3.刚才fork的进程也随之退出。

    4.如果下次用户还请求动态资源,那么web服务器又再次fork一个新进程,周而复始的进行。

    FastCGI工作原理

    Fastcgi则会先fork一个master,解析配置文件,初始化执行环境,然后再fork多个worker。

    2.当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。

    3.而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是Fastcgi的对进程的管理。大多数Fastcgi实现都会维护一个进程池。

    注:swoole作为httpserver,实际上也是类似这样的工作方式。

    Nginx与php-fpm通信分析

    Nginx与php-fpm通信有两种方式,一种是通过tcp socket和 unix socket。前者是通过ip:端口方式进行通信,后者是通过php启动生成的socket文件进行通信。因此tcp socket的方式可以将两者分布再不同的机器上,只要Nginx能够连接到php服务器的端口即可。后者的方式,是统一主机上进行通讯的方式,因此两者只能再同一台机器上面。

    tcp socket和 unix socket两者的优缺点

    由于 Unix socket 不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。所以其效率比 tcp socket 的方式要高,可减少不必要的 tcp 开销。不过,unix socket 高并发时不稳定,连接数爆发时,会产生大量的长时缓存,在没有面向连接协议的支撑下,大数据包可能会直接出错不返回异常。而 tcp 这样的面向连接的协议,可以更好的保证通信的正确性和完整性。

    如何选择tcp socket与unix socket

    1.由于tcp方式相对unix的方式,并发量更高,因此针对并发量高的项目,建议采用tcp方式,现在Nginx配置示例文件默认的也是tcp方式。

    2.使用unix方式,可以优化的点,就是将socket文件放在/dev/shm目录下面,至于为什么放在这个目录可以参考.https://www.linuxidc.com/Linux/2014-05/101818.htm。大致的意思,就是该目录下面的文件是不是存储再硬盘中的,而是存储再内存中的。至于硬盘读取和内存读取,谁快谁慢,肯定是内存最快了。

    3.使用unix方式可以使用backlog,backlog的介绍,可以参考该文章。https://blog.csdn.net/raintungli/article/details/37913765。具体的配置可以参考下面。nginx 配置:

    server {
      listen 80 default backlog = 100;
      }
    로그인 후 복사

    php-fpm 配置:

    listen.backlog = 1000
    로그인 후 복사
    配置示例

    Nginx与PHP通信的方式,取决于PHP启动的方式,下面直接演示两种方式的配置文件,后面记录PHP启动方式的配置 1.tcp socket

    server {
            listen       80;
            server_name  laravel_demo.com;
            charset utf-8;
            access_log  logs/laravel_demo.com.access.log;
            root   /usr/local/var/www/laravel64_demo/public/;
            index  index.php index.html index.htm;
    
            error_page   500 502 503 504  /50x.html;
    
            location / {
                if (!-e $request_filename) {
                    rewrite ^(.*)$  /index.php?s=$1 last;
                    break;
                }
            }
            ### 此处就是Nginx与tcp socket通信配置,这里部署的同一台及其,因此IP就是127.0.0.1
            location ~ \.php$ {
                    fastcgi_pass   127.0.0.1:9000;
                    fastcgi_index  index.php;
                    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                    include        fastcgi_params;
                }
        }
    로그인 후 복사

    2.unix socket

    server {
            listen       80;
            server_name  laravel_demo.com;
            charset utf-8;
            access_log  logs/laravel_demo.com.access.log;
            root   /usr/local/var/www/laravel64_demo/public/;
            index  index.php index.html index.htm;
    
            error_page   500 502 503 504  /50x.html;
    
            location / {
                if (!-e $request_filename) {
                    rewrite ^(.*)$  /index.php?s=$1 last;
                    break;
                }
            }
            ### 此处就是Nginx与unix socket通信配置,我的socket文件在/usr/run/目录下
            location ~ \.php$ {
                    fasrcgi_pass /usr/tmp/php-fpm.sock;
                    fastcgi_index  index.php;
                    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                    include        fastcgi_params;
                }
        }
    로그인 후 복사

    上面演示了具体的配置示例,下面演示的是PHP启动方式的配置,这里需要和上面Nginx的配置一致,如果是tcp方式就采用tcp方式启动,如果是unix方式采用socket文件的方式启动。

    # tcp方式启动
    listen = 127.0.0.1:9000
    # unix方式启动
    listen = /usr/tmp/php-fpm.sock;
    로그인 후 복사

    采用上面的两种方式中的任意一种,直接使用php-fpm方式启动php即可。

    1、tcp方式启动的效果图

    Nginx와 php-fpm 간의 통신 메커니즘을 간략하게 분석한 기사

    2、unix方式启动的效果图

    Nginx와 php-fpm 간의 통신 메커니즘을 간략하게 분석한 기사

    注意在演示的过程中遇到一个问题就是提示Nginx无法读取php生成的unix socket文件。这中情况是因为权限组导致的。因此再php-fpm的配置配置文件中要设置权限组,同时Nginx也需要设置权限组,再很多的集成开发环境中已经配置好了,因此可以减少此步骤。下面就是示例 Nginx配置文件:

    #配置php-fpm的用户以及所属用户组
    user  www www;
    
    worker_processes auto;
    
    error_log  /home/wwwlogs/nginx_error.log  crit;
    
    pid        /usr/local/nginx/logs/nginx.pid;
    
    #Specifies the value for maximum file descriptors that can be opened by this process.
    worker_rlimit_nofile 51200;
    로그인 후 복사

    php-fpm配置文件(我们平常可能更多的是配置php.ini的文件,这里需要区分两者之间的区别,php.ini是针对php的配置文件,可以简单的理解为php再编译源码时会用到这里的配置,而关于php这个应用程序执行的情况就会用到php-fpm的配置文件):

    ; 配置php-fpm的用户以及所属用户组
    user = www
    group = www
    
    ; The address on which to accept FastCGI requests.
    ; Valid syntaxes are:
    ;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific IPv4 address on
    ;                            a specific port;
    ;   '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
    ;                            a specific port;
    ;   'port'                 - to listen on a TCP socket to all addresses
    ;                            (IPv6 and IPv4-mapped) on a specific port;
    ;   '/path/to/unix/socket' - to listen on a unix socket.
    ; Note: This value is mandatory.
    ;listen = 127.0.0.1:9000
    listen = /usr/tmp/php-fpm.sock;
    로그인 후 복사

    推荐教程:nginx教程

위 내용은 Nginx와 php-fpm 간의 통신 메커니즘을 간략하게 분석한 기사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

nginx가 시작되었는지 확인하는 방법은 무엇입니까? nginx가 시작되었는지 확인하는 방법은 무엇입니까? Apr 14, 2025 pm 12:48 PM

Linux에서는 다음 명령을 사용하여 nginx가 시작되었는지 확인하십시오. SystemCTL 상태 Nginx 판사 명령 출력에 따라 : "active : running"이 표시되면 Nginx가 시작됩니다. "Active : 비활성 (죽음)"이 표시되면 Nginx가 중지됩니다.

Windows에서 nginx를 구성하는 방법 Windows에서 nginx를 구성하는 방법 Apr 14, 2025 pm 12:57 PM

Windows에서 Nginx를 구성하는 방법은 무엇입니까? nginx를 설치하고 가상 호스트 구성을 만듭니다. 기본 구성 파일을 수정하고 가상 호스트 구성을 포함하십시오. 시작 또는 새로 고침 Nginx. 구성을 테스트하고 웹 사이트를보십시오. SSL을 선택적으로 활성화하고 SSL 인증서를 구성하십시오. 포트 80 및 443 트래픽을 허용하도록 방화벽을 선택적으로 설정하십시오.

nginx가 시작되었는지 확인하는 방법 nginx가 시작되었는지 확인하는 방법 Apr 14, 2025 pm 01:03 PM

nginx가 시작되었는지 확인하는 방법 : 1. 명령 줄을 사용하십시오 : SystemCTL 상태 nginx (linux/unix), netstat -ano | Findstr 80 (Windows); 2. 포트 80이 열려 있는지 확인하십시오. 3. 시스템 로그에서 nginx 시작 메시지를 확인하십시오. 4. Nagios, Zabbix 및 Icinga와 같은 타사 도구를 사용하십시오.

Linux에서 Nginx를 시작하는 방법 Linux에서 Nginx를 시작하는 방법 Apr 14, 2025 pm 12:51 PM

Linux에서 Nginx를 시작하는 단계 : Nginx가 설치되어 있는지 확인하십시오. systemctl start nginx를 사용하여 nginx 서비스를 시작하십시오. SystemCTL을 사용하여 NGINX를 사용하여 시스템 시작시 NGINX의 자동 시작을 활성화하십시오. SystemCTL 상태 nginx를 사용하여 시작이 성공했는지 확인하십시오. 기본 환영 페이지를 보려면 웹 브라우저의 http : // localhost를 방문하십시오.

PHP : 데이터베이스 및 서버 측 로직 처리 PHP : 데이터베이스 및 서버 측 로직 처리 Apr 15, 2025 am 12:15 AM

PHP는 MySQLI 및 PDO 확장 기능을 사용하여 데이터베이스 작업 및 서버 측 로직 프로세싱에서 상호 작용하고 세션 관리와 같은 기능을 통해 서버 측로 로직을 처리합니다. 1) MySQLI 또는 PDO를 사용하여 데이터베이스에 연결하고 SQL 쿼리를 실행하십시오. 2) 세션 관리 및 기타 기능을 통해 HTTP 요청 및 사용자 상태를 처리합니다. 3) 트랜잭션을 사용하여 데이터베이스 작업의 원자력을 보장하십시오. 4) SQL 주입 방지, 디버깅을 위해 예외 처리 및 폐쇄 연결을 사용하십시오. 5) 인덱싱 및 캐시를 통해 성능을 최적화하고, 읽을 수있는 코드를 작성하고, 오류 처리를 수행하십시오.

PHP의 목적 : 동적 웹 사이트 구축 PHP의 목적 : 동적 웹 사이트 구축 Apr 15, 2025 am 12:18 AM

PHP는 동적 웹 사이트를 구축하는 데 사용되며 해당 핵심 기능에는 다음이 포함됩니다. 1. 데이터베이스와 연결하여 동적 컨텐츠를 생성하고 웹 페이지를 실시간으로 생성합니다. 2. 사용자 상호 작용 및 양식 제출을 처리하고 입력을 확인하고 작업에 응답합니다. 3. 개인화 된 경험을 제공하기 위해 세션 및 사용자 인증을 관리합니다. 4. 성능을 최적화하고 모범 사례를 따라 웹 사이트 효율성 및 보안을 개선하십시오.

Nginx403을 해결하는 방법 Nginx403을 해결하는 방법 Apr 14, 2025 am 10:33 AM

Nginx 403 금지 된 오류를 수정하는 방법은 무엇입니까? 파일 또는 디렉토리 권한을 확인합니다. 2. 확인 파일을 확인하십시오. 3. nginx 구성 파일 확인; 4. nginx를 다시 시작하십시오. 다른 가능한 원인으로는 방화벽 규칙, Selinux 설정 또는 응용 프로그램 문제가 있습니다.

nginx 서버를 시작하는 방법 nginx 서버를 시작하는 방법 Apr 14, 2025 pm 12:27 PM

Nginx 서버를 시작하려면 다른 운영 체제에 따라 다른 단계가 필요합니다. Linux/Unix System : Nginx 패키지 설치 (예 : APT-Get 또는 Yum 사용). SystemCTL을 사용하여 nginx 서비스를 시작하십시오 (예 : Sudo SystemCtl start nginx). Windows 시스템 : Windows 바이너리 파일을 다운로드하여 설치합니다. nginx.exe 실행 파일을 사용하여 nginx를 시작하십시오 (예 : nginx.exe -c conf \ nginx.conf). 어떤 운영 체제를 사용하든 서버 IP에 액세스 할 수 있습니다.

See all articles