原作者链接:https://www.aicyun.com/article/34
原理
nginx只是 web 中的内容分发者,比如,如果请求/index.html,那么web server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据。好了,如果现在请求的是/index.php,根据配置文件,nginx知道这个不是静态文件,需要去找PHP解析器来处理,那么他会把这个请求简单处理后交给PHP解析器。即启动对应的CGI程序,PHP解析器会解析php.ini文件,初始化一个环境进程,然后处理请求,在以规定CGI规定的格式返回处理后的结果,退出进程,nginx 在把结果返回给浏览器.
CGI
CGI是公共网关接口(common gateway interface);http 服务器与你的或者其他机器上的程序进行交谈的一种工具,程序需运行在网络服务器上
CGI可以用于任何语言,只有这种语言具有标准的输入,输出和环境变量.
CGI是个协议.
FastCGI
Fastcgi是用来提高CGI程序性能的,CGI程序的性能出在CGI对每个请求都会执行解析php.ini初始化执行环境
这些步骤,每次请求都启动一个进程,假如有几千万请求那就完了.
Fastcgi会先启动一个master,专门解析配置,初始化环境,在启动多个worker进程,请求来了,master会传递给一个worker,然后继续等待下一个请求,这就避免了重复的解析和初始化,效率提升不少.假如worker进程不够,master主进程会多启动几个 worker,如果空闲了,master 会主动停止一些 worker.这节省了大量的资源
PHP-CGI
PHP-CGI是PHP自带的FastCGI管理器
弊端:
- php-cgi假如改了配置文件需要重启php-cgi,不能做到平滑重启
- 直接杀死php-cgi进程,php 就不能运行了
PHP-FPM
PHP-FPM是一个PHP FastCGI管理器,准确的说是管理的 php-cgi,fastcgi是一种协议,和进程无关.php-fpm在修改php.ini后不像php-cgi不能平滑重启.php-fpm会让新的worker用新的配置,已经存在的 worker 处理完了就停止了.
php-cgi只是解释PHP脚本的程序而已
Spawn-FCGI
通用的FastCGI管理服务器,lighttpd的一部分.最新的lighttpd也没有包含这一块,不建议使用.