Home >Backend Development >PHP Tutorial >Introduction to the communication mechanism between PHP-FPM and Nginx (with examples)

Introduction to the communication mechanism between PHP-FPM and Nginx (with examples)

不言
不言forward
2019-01-29 11:04:402675browse

This article brings you an introduction to the communication mechanism between PHP-FPM and Nginx (with examples). It has certain reference value. Friends in need can refer to it. I hope it will be helpful to you.

PHP-FPM Introduction

  • CGI protocol and FastCGI protocol

Each dynamic language ( PHP, Python, etc.) code files need to pass the corresponding parser to be recognized by the server, and the CGI protocol is used to enable the interpreter and the server to communicate with each other. The parsing of PHP files on the server requires the use of a PHP interpreter, coupled with the corresponding CGI protocol, so that the server can parse PHP files.

Since the mechanism of CGI requires forking a CGI process for each request, and then killing the process after the request is completed, which is a waste of resources in practical applications, so an improved version of CGI, FastCGI, appeared. After processing, the process will not be killed, but multiple requests will continue to be processed, which greatly improves efficiency.

  • What is PHP-FPM

PHP-FPM is the PHP-FastCGI Process Manager, which is the implementation of FastCGI and provides process management function. The process includes two types: master process and worker process; there is only one master process, which is responsible for listening to the port and receiving requests from the server, while there are generally multiple worker processes (the specific number is configured according to actual needs), and each process will have one embedded in it. The PHP interpreter is where the code is actually executed.

Nginx and php-fpm communication mechanism

When we visit a website (such as www.test.com), the processing flow is as follows:

  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 combined with php-fpm

On Linux, Nginx communicates with php-fpm through tcp and unix socket.

The advantage of tcp is that it can cross servers. This method can only be used when Nginx and PHP-fpm are not on the same machine.

Unix socket is also called IPC (inter-process communication) socket, which is used to implement inter-process communication on the same host. This method requires filling in the socket file location of php-fpm in the nginx configuration file. .

The data transmission process of the two methods is shown in the figure below:

Introduction to the communication mechanism between PHP-FPM and Nginx (with examples)

The difference between the two:

Due to Unix socket There is no need to go through the network protocol stack, package and unpack, calculate checksums, maintain sequence numbers and responses, etc. It just copies the application layer data from one process to another. Therefore, its efficiency is higher than that of tcp, which can reduce unnecessary tcp overhead. However, Unix sockets are unstable when concurrency is high. When the number of connections explodes, a large number of long-term caches will be generated. Without the support of a connection-oriented protocol, large data packets may directly go wrong without returning an exception. Connection-oriented protocols such as tcp can better ensure the correctness and integrity of communication.

The combination of Nginx and php-fpm only requires settings in their respective configuration files:

1) Configuration in Nginx

Take tcp communication as an example

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) Configuration of php-fpm

listen = 127.0.0.1:9000
# 或者下面这样
listen = /var/run/php-fpm.sock
Note that when using Unix socket to connect, since the socket file is essentially a file, there are permission control issues, so you need to pay attention to the Nginx process There is a permission issue with php-fpm, otherwise it will prompt that there is no permission to access. (Set users in respective configuration files)

The communication between php-fpm and Nginx can be completed through the above configuration.

The above is the detailed content of Introduction to the communication mechanism between PHP-FPM and Nginx (with examples). For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:segmentfault.com. If there is any infringement, please contact admin@php.cn delete
Previous article:What is namespace in PHPNext article:What is namespace in PHP