php部署到nginx,php和nginx之间是如何工作的
CGI的全称是“公共网关接口”,是HTTP server与你的程序或者其他电脑上的程序“对话”的工具。它的程序必须在网络服务器上运行。CGI本身可以看作是一种协议标准,它可以用任何语言编写,只要该语言有标准的输入、输出和环境变量。如php、perl、tcl等。
方法/步骤
FastCGI就像一个长寿的CGI,可以一直执行。一旦激活,每次分叉一次就不用花时间了(这是CGI最受诟病的分叉执行模式)。它还支持分布式计算,即FastCGI程序可以在web服务器之外的主机上执行,并接收来自其他web服务器的请求。FastCGI是一个独立于语言的、可扩展的CGI开放扩展。它的主要行为是将CGI解释器进程保留在内存中,从而获得高性能。众所周知,CGI解释器的重复加载是CGI性能低下的主要原因。如果CGI解释器保存在内存中,由FastCGI进程管理器调度,它可以提供良好的性能、可伸缩性、故障转移特性等。FastCGI也可以称为协议标准。例如,下面的php-fpm是一个FastCGI进程管理器/引擎,支持解析php。
FastCGI的特点FastCGI是独立于语言的。FastCGI在进程中的应用独立于核心web服务器运行,提供了比API更安全的环境。API将应用程序代码与核心web服务器链接起来,这意味着使用错误API的应用程序可能会损害其他应用程序或核心服务器。恶意API的应用程序代码甚至可以窃取另一个应用程序或核心服务器的密钥。目前FastCGI技术支持的语言有:C/C、Java、Perl、Tcl、Python、SmallTalk、Ruby等。相关的模块也可以在流行的服务器上获得,比如Apache、ISS、Lighttpd等。FastCGI不依赖于任何Web服务器的内部架构,因此即使服务器技术发生变化,FastCGI仍然保持稳定。
FastCGI的工作原理Web服务器启动时,加载FastCGI进程管理器(IIS ISAPI或Apache模块)。fastcgi进程管理器初始化自己,启动多个cgi解释器进程(可以看到多个php-cgi)并等待来自Web服务器的连接。当客户机请求到达Web服务器时,FastCGI进程管理器选择并连接到一个CGI解释器。服务器向FastCGI子进程php-cgi发送CGI环境变量和标准输入。FastCGI子进程在处理后从同一个连接向Web服务器返回标准输出和错误信息。当FastCGI子进程关闭连接时,请求被处理。FastCGI子进程然后等待并处理来自FastCGI进度管理器(运行在Web服务器中)的下一个连接。在CGI模式下,php-cgi在这里退出。以上情况,可以想象CGI通常有多慢。每个Web请求PHP都必须重新解析php.ini,重新加载所有扩展,并初始化所有数据结构。使用FastCGI,所有这些在进程开始时只发生一次。另一个好处是持久数据库连接可以工作。
FastCGI的不足之处在于它是多进程的,所以比CGI多线程消耗更多的服务器内存。PHP-CGI解释器每个进程消耗7到25兆的内存。这个数乘以50或者100就是很大的内存量。NGX0.8.46 PHP 5.2.14 (FastCGI)服务器3万并发连接下,10个Nginx进程启动消耗150M内存(15M*10=150M),64个php-cgi进程启动消耗1280M内存(20M*64=1280M),加上系统本身消耗的内存。如果服务器内存较小,只能启动25个php-cgi进程,这样php-cgi消耗的总内存只有500M。以上数据摘自Nginx 0.8.x PHP 5.2.13(FastCGI)构建一个比Apache好十倍的Web服务器(第6版)。
PHP-CGI是PHP自带的FastCGI管理器。php-cgi的缺点:php-cgi需要在更改php.ini的配置后重新启动PHP-CGI才能使新的php-ini生效,所以无法顺利重启。直接杀死php-cgi进程,php就不会运行了。(PHP-FPM和Spawn-FCGI没有这个问题,守护进程会平滑地重新生成新的子进程。)
PHP-FPM是一个PHP FastCGI管理器,只用于PHP,可以从http://PHP-fpm.org/download.下载PHP-其实是PHP源代码的补丁,旨在将FastCGI进程管理集成到PHP包中。在编译和安装PHP之后,必须将它修补到PHP源代码中才能使用。现在我们可以从最新的PHP 5.3.2的源码树中下载得到直接集成PHP-FPM的分支。据说下一个版本会并入PHP的主分支。与Spawn-FCGI相比,PHP-FPM在CPU和内存控制上更胜一筹,前者容易崩溃,必须被crontab监控,而PHP-FPM则没有这个麻烦。PHP5.3.3已经集成了php-fpm,不再是第三方包。PHP-FPM提供了更好的管理PHP进程的方法,可以有效的控制内存和进程,平滑和重载PHP配置,比spawn-fcgi多了点,所以被PHP官方收录了。什么时候。/configure,bring - enable-fpm参数打开PHP-FPM。
Spawn-FCGI Spawn-FCGI是一个通用FastCGI管理服务器,它是lighttpd的一部分。很多人使用Lighttpd的Spawn-FCGI在FastCGI模式下进行管理,但是有很多缺点。不过PHP-FPM的出现多少缓解了一些问题,但是PHP-FPM有一个缺点就是需要重新编译,对于一些已经运行的环境来说可能有很大的风险(参考)。PHP-FPM可以在php 5.3.3中直接使用。
目前Spawn-FCGI已经成为一个独立的项目,更加稳定,给很多网站的配置带来了便利。很多网站都把它和nginx搭配起来解决动态网页。
比较PHP-FPM和spawn-CGI,使用PHP-FPM非常方便。配置在PHP-FPM.ini的文件中,启动和重启可以从php/sbin/PHP-FPM进行。更方便的是,修改完php.ini后,可以直接使用php-FPM reload加载,就可以完成php的修改了。加载结果表明,使用PHP-FPM可以提高PHP的性能。PHP-FPM控制的进程cpu恢复速度慢,内存分配非常均匀。Spawn-FCGI控制的进程CPU下降很快,但是内存分配不均匀。很多进程看起来是没有分配的,而另一些进程却占用了很多。可能是流程任务分配不均造成的。这也导致了整体响应速度的下降。PHP-FPM的合理分配导致了整体响应和任务平均的提及。
总结:fastCGI是nginx和php之间的通信接口。该接口的实际处理过程启动php-fpm进程解析php脚本,即php-fpm充当动态应用服务器,从而实现nginx对php的动态解析。因此,如果nginx服务器需要支持php解析,就需要在nginx.conf中添加php配置:将php脚本转发到fastCGI进程监听的IP地址和端口(在php-fpm.conf中指定)。同时,在安装php时,需要开启支持fastCGI的选项,编译安装php-fpm补丁/扩展。同时需要启动php-fpm进程,才能通过fastCGI解析nginx转发的php脚本。