要说Nginx与PHP如何协同工作,首先得说CGI和FastCGI两个协议。

CGI是Web Server与后台语言交互的协议,有了这个协议,开发者可以使用任何语言处理Web Server发来的请求,动态的生成内容。但CGI有个致命缺点,那就是每处理一个请求都需要fork一个全新的进程,这样低效的方式明显不能满足需求,这样FastCGI诞生了。FastCGI顾名思义为更快的CGI。它允许在一个进程内处理多个请求,而不是一个请求处理完毕就直接结束进程,性能上有了很大的提升。

FPM就是FastCGI的实现,任何实现了FastCGI协议的Web Server都能够与之通信。

FPM是一个PHP进程管理器,包含master进程和worker进程两种:master只有一个,负责监听端口,接收来自Web Server的请求,而worker则一般有多个,每个worker内部都嵌入一个PHP解释器,是PHP代码真正执行的地方。

FPM接收到请求,到处理完毕,具体流程如下:
1.FPM的master进程接收到请求
2.master进程根据配置指派特定的worker进程进行请求处理,如果没有可用进程,返回错误,这也是配合Nginx遇到502错误的原因。
3.worker进程处理请求,如果超时,返回504
4.请求处理结束,返回结果。

为了能使Nginx理解FastCGI协议,Nginx提供了FastCGI模块来将http请求映射为对应FastCGI请求。
Nginx的FastCGI模块提供了fastcgi_param指令来主要处理这些映射关系,主要完成的工作是将Nginx中的变量翻译成PHP中能够理解的变量。
除此之外,非常重要的就是fastcgi_pass指令了,用来指定FPM进程监听的地址,Nginx会把所有的PHP请求翻译成FastCGI请求后再发送到FPM地址  

posted on 2019-09-07 10:58  caohongchang  阅读(530)  评论(0编辑  收藏  举报