PHP-FPM+Nginx进程通信原理图文剖析
PHP-FPM
的全称是PHP FastCGI Process Manager
,PHP-FPM是FastCGI的实现,并提供了进程管理的功能。FastCGI进程包含master进程和worker进程两种进程。master进程只有一个,负责监听端口,接收Nginx的请求,而worker进程则一般有多个(可配置),每个进程内部都嵌入了一个PHP解释器,是PHP代码真正执行的地方。
Nginx (“engine x”)
是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP
服务器。这里介绍一下什么是正向代理和反向代理,这个对于我们理解Nginx很重要
FastCGI
致力于减少Web服务器与CGI程序之间互动的开销,从而使服务器可以同时处理更多的Web请求。与CGI这种为每个请求创建一个新的进程不同,FastCGI使用持续的进程来处理一连串的请求。
这些进程由FastCGI进程管理器管理,而不是web服务器。通过图来理解PHP-FPM和Nginx的通信
fastcgi_pass 127.0.0.1:9000;
或者
fastcgi_pass unix:/tmp/php-cgi.sock;
它其实是Nginx和PHP-FPM一个通信载体(或者说通信方式),目的是为了让Nginx知道,收到动态请求之后该往哪儿发。(关于这两种配置的区别,后边会专门介绍)
fastcgi
:fastcgi
是一个协议。市面上有多种实现了fastcgi协议的进程管理器,php-fpm就是其中的一种。php-fpm作为一种fastcgi进程管理服务,会监听端口,一般默认监听9000端口,并且是监听本机,也就是只接收来自本机的端口请求fastcgi.conf
和 fastcgi_params。
不同的nginx版本会有不同的配置文件,这两个配置文件有一个非常重要的区别:
fastcgi_parames
文件中缺少下列配置:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
我们可以打开fastcgi_params
文件加上上述行,也可以在要使用配置的地方动态添加。使得该配置生效
1. 第一种:文件地址
/usr/local/openresty/nginx/conf/fastcgi.conf
2. 第二种:文件地址为nginx server
的php配置项。使用配置的地方动态添加:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
location ~ \.php$ {
try_files $fastcgi_script_name =404;
include fastcgi_params;
# fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
include fastcgi_params;
引入fastcgi配置文件fastcgi_pass 127.0.0.1:9000;
这行代码的意思是,将进入到该location内的uri请求看做是cgi程序,并将请求发送到9000端口,交由php-fpm处理(php-fpm配置中会看见它监听了此端口)Nginx和PHP-FPM的进程间通信有两种方式,一种是TCP Socket
,一种是Unix Socket
.
Tcp Socket
方式是IP+端口
,可以跨服务器,而UNIX Socket
不经过网络,只能用于Nginx跟PHP-FPM都在同一服务器的场景,用哪种取决于你的PHP-FPM配置。
fastcgi_pass 127.0.0.1:9000;
listen=127.0.0.1:9000;
Nginx <=> socket <=> TCP/IP <=> socket <=> PHP-FPM
Nginx <=> socket <=> TCP/IP <=> 物理层 <=> 路由器 <=> 物理层 <=> TCP/IP <=> socket <=> PHP-FPM
fastcgi_pass unix:/tmp/php-fpm.sock;
listen = /tmp/php-fpm.sock
;(php-fpm.sock
是一个文件,由php-fpm
生成)Nginx <=> socket <=> PHP-FPM