Summary of communication mechanism between PHP-FPM and Nginx
PHP-FPM Introduction
CGI protocol and FastCGI protocol
The code files required for each dynamic language (PHP, Python, etc.) It can be recognized by the server through the corresponding parser, 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 PHP-FastCGI Process Manager. It is the implementation of FastCGI and provides process management functions. 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 | | 等待处理...
The combination of Nginx and php-fpm
On Linux, there are two ways of communication between nginx and php-fpm: tcp socket and unix socket.
The advantage of tcp socket 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, also called IPC (inter-process communication) socket, 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:
The difference between the two:
Since Unix socket does not need to go through The network protocol stack does not need to package and unpack, calculate checksums, maintain sequence numbers and responses, etc. It just copies application layer data from one process to another. Therefore, its efficiency is higher than that of tcp socket, 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.
To combine Nginx with php-fpm, you only need to make settings in their respective configuration files:
1) Configuration in Nginx
Take tcp socket 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 method to connect, since the socket file is essentially a file , there is a problem of permission control, so you need to pay attention to the permissions of the nginx process and the permissions of php-fpm, otherwise you will be prompted to access without permission. (Set users in respective configuration files)
The communication between php-fpm and nginx can be completed through the above configuration.
Selection in the application
If nginx and php-fpm are running on the same server, and the concurrency is not high (no more than 1000), select unix socket to improve the communication efficiency between nginx and php-fpm.
If you are facing high concurrent business, consider using a more reliable tcp socket to maintain efficiency through operation and maintenance methods such as load balancing and kernel optimization.
If the concurrency is high but you still want to use unix socket, you can improve the stability of unix socket through the following methods.
1) Place the sock file in the /dev/shm directory. Place the sock file in the memory in this directory, so that the memory can be read and written faster.
2) Increase the backlog
Backlog default bit 128, 1024, this value is replaced by your normal QPS, the configuration is as follows.
nginx.conf file
server { listen 80 default backlog = 1024; }
php-fpm.conf file
listen.backlog = 1024
3) Add sock file and php-fpm instance
Create a new sock file in /dev/shm, load balance requests to two sock files through the upstream module in nginx, and map the two sock files to two sets of php-fpm instances.
Personal summary, if there is anything wrong, please correct me~
Related recommendations: "PHP Tutorial"
The above is the detailed content of Summary of communication mechanism between PHP-FPM and Nginx. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

How to configure Nginx in Windows? Install Nginx and create a virtual host configuration. Modify the main configuration file and include the virtual host configuration. Start or reload Nginx. Test the configuration and view the website. Selectively enable SSL and configure SSL certificates. Selectively set the firewall to allow port 80 and 443 traffic.

You can query the Docker container name by following the steps: List all containers (docker ps). Filter the container list (using the grep command). Gets the container name (located in the "NAMES" column).

Docker container startup steps: Pull the container image: Run "docker pull [mirror name]". Create a container: Use "docker create [options] [mirror name] [commands and parameters]". Start the container: Execute "docker start [Container name or ID]". Check container status: Verify that the container is running with "docker ps".

How to confirm whether Nginx is started: 1. Use the command line: systemctl status nginx (Linux/Unix), netstat -ano | findstr 80 (Windows); 2. Check whether port 80 is open; 3. Check the Nginx startup message in the system log; 4. Use third-party tools, such as Nagios, Zabbix, and Icinga.

The methods that can query the Nginx version are: use the nginx -v command; view the version directive in the nginx.conf file; open the Nginx error page and view the page title.

Create a container in Docker: 1. Pull the image: docker pull [mirror name] 2. Create a container: docker run [Options] [mirror name] [Command] 3. Start the container: docker start [Container name]

How to configure an Nginx domain name on a cloud server: Create an A record pointing to the public IP address of the cloud server. Add virtual host blocks in the Nginx configuration file, specifying the listening port, domain name, and website root directory. Restart Nginx to apply the changes. Access the domain name test configuration. Other notes: Install the SSL certificate to enable HTTPS, ensure that the firewall allows port 80 traffic, and wait for DNS resolution to take effect.

Starting an Nginx server requires different steps according to different operating systems: Linux/Unix system: Install the Nginx package (for example, using apt-get or yum). Use systemctl to start an Nginx service (for example, sudo systemctl start nginx). Windows system: Download and install Windows binary files. Start Nginx using the nginx.exe executable (for example, nginx.exe -c conf\nginx.conf). No matter which operating system you use, you can access the server IP
