在介绍Nginx和PHP-FPM的工作机制之前,先了解下面几个名词:
名词解释CGI:CGI的英文是(COMMONGATEWAYINTERFACE)公共网关接口,是WebServer与WebApplication之间数据交换的一种协议。它的作用就是帮助服务器与后端语言通信,这里就是nginx和php进行通信,因为nginx和php的语言不通,因此需要一个沟通转换的过程,而CGI就是这个沟通的协议。
FastCGI:同CGI,是一种通信协议,但比CGI在效率上做了一些优化。
PHP-CGI:是PHP(WebApplication)对WebServer提供的CGI协议的接口程序。
PHP-FPM:它是FastCGI的实现,是PHP(WebApplication)对WebServer提供的FastCGI协议的接口程序。PHP-FPM是一个PHP进程管理器,包含master进程和worker两种进程:master进程只有一个,负责监听端口,接收来自WebServer的请求,而worker进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个PHP解释器,是PHP代码真正执行的地方。
了解完这些名词之后,我们开始来介绍一下Nginx、PHP-FPM的工作方式,以及二者之间是如何通信的。
如上面所介绍,CGI是WebServer与后台语言交互的协议,有了这个协议,开发者可以使用任何语言处理WebServer发来的请求,动态的生成内容。但CGI有一个致命的缺点,那就是每处理一个请求都需要fork一个CGI进程,请求结束再kill掉这个进程,在实际应用上比较浪费资源。随着Web的兴起,高并发越来越成为常态,这样低效的方式显然不能满足需求。于是就出现了CGI的改良版本FastCGI,逐渐的CGI就退出了历史的舞台。FastCGI顾名思义是更快的CGI,FastCGI在请求处理完后,不会kill掉进程,而是继续处理多个请求,这样就大大提高了效率。
至于FPM(FastCGIProcessManager),它是FastCGI的实现,任何实现了FastCGI协议的WebServer都能够与之通信。
FPM是PHP进程管理器,包含master进程和worker进程:master进程只有一个,负责监听端口,接收来自WebServer的请求,而worker进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个PHP解释器,是PHP代码真正执行的地方。
PHP-FPM处理请求的流程FPM的master进程接收到请求;
master进程根据配置指派特定的worker进程进行请求处理,如果没有可用进程,返回错误;
worker进程处理请求,如果超时,返回错误;
请求处理结束,返回结果。
Nginx如何发送请求给fpm的呢?我们知道,Nginx不仅仅是一个Web服务器,也是一个功能强大的Proxy服务器,除了进行