cgi、fastcgi、php-fpm、apache handler模块

LAMP 17codes 124℃ 0评论

    CGI:CGI是为了保证webserver传递过来的数据是标准格式的,它是一个协议,方便CGI程序的编写者。

web server(apache/nginx)只是内容分发。用户请求/index.html,那么server会去文件系统中找到这个文件,返回给浏览器,这里分发的是静态数据。如果现在请求的是/index.php,根据配置文件server 知道这个不是静态文件,需要去找 php解释器来处理,那么它会把这个请求处理后,交给php解释器。 Server会传那些数据给php解释器呢,URL,QueryString,HttpHeader等等,CGI就是规定要传那些数据,以什么样的格式传递给cgi程序来处理这个请求的协议。当server收到 /index.php这个请求后,会启动对应的CGI程序,这里就是PHP的解释器,接下来PHP解释器会解析php.ini文件,初始化环境,然后处理请求,再以CGI规定的格式讲处理结果放回给server,退出进程,server再把结果返回给浏览器。

    FastCGI:用来提高CGI程序性能的,可以理解为在CGI协议上做了些拓展,下面来说明说了那些拓展。

 CGI的程序性能问题:标准的CGI对每个请求都会执行这些步骤,所以处理每个请求的时间比较长。这里明显不合理,那么FastCGI会怎么做? FastCGI会启动一个master进程,解析配置文件,初始化执行环境,然后再启动多个worker进程。当有请求过来的时候,master会分配一个worker进程,然后立即接受下一个请求。这样避免重复劳动,效率自然高。而且当worker进程不够用的时候, master进程可以根据配置预先启动几个worker等待着,当然空闲worker太多时候,也会停掉一些。这就是FastCGI对进程的管理。

    FastCGI的不足:

因为是多进程,所以比CGI多线程消耗更多的服务器内存,PHP-CGI解释器每个进程小号7M到25M内存,将这个数字乘以100就是很大的内存数了。 Nginx+PHP5,服务器再3万并发连接下,开启的10个Nginx进程消耗150M内存(15M*10=150M),开启的64个php-cgi进程消耗1280M内存(64*20M=1280M),加上系统自身的消耗的内存,总共消耗不到2GB内存

    说完cgi、fastcgi协议标准,下面来说说这些协议标准的实现者:php-cgi和php-fpm。

1)php-cgi是早期php官方提供的fastcgi程序,但是由于实现的是单进程,一个进程处理完请求后就销毁。

2)php-fpm是一个实现了FastCGI协议的程序,被PHP官方收了(php版本5.4后)。

最开始的时候,php-fpm没有包含在php内核里面,要使用这个功能,需要找到与源码相同的php-fpm对内核打补丁,然后再编译。后来php内核集成了php-fpm之后,编译的时候使用–enable-fpm这个编译参数即可,与版本有关系,php5.4之前, php-fpm第三方编译,php-fpm是进程管理器,php-cgi是解释器。 php5.4之后,php-fpm是官方自带,master与pool模式,php-fpm与php-cgi没有关系了,php-fpm是一个独立的SAPI,其管理的不是php-cgi,也就是说php-fpm跟php-cgi无关,php-fpm内置了php解释器,php-fpm的子进程是自己fork出来 的,并不会调用php-cgi,你把php-cgi删除了,也不会影响php-fpm的正常运行。

    实践:在Linux中,Apache要运行php脚本,有两个方法

1)Apache Handler 模块模式

PHP作为Apache模块,Apache服务器再系统启动之后,预先生成多个进程副本驻留再内存中,一旦有请求出现,就立即使用这些空余的子进程进行处理,这样就 不存在生成子进程造成的延迟了。这些服务器副本再处理完一次HTTP请求之后并不立即推出,而是停留再计算机中等待下次请求。对于客户浏览器的请求反映更快, 性能较高 。采用此方式时,编译php源码的时候需要加上–with-apxs2=/path/apache/bin/apxs,这样会在apache的生成libphp5.so模块,通过修改配置文件 LoadModule php5_module modules/libphp5.so,然后在<IfModule mime_module>中添加AddType application/x-httpd-php .php AddType applicaiton/x-httpd-php-source .phps

2.1)FastCGI模式,用Apache内置进程管理器
#wget http://www.fastcgi.com/dist/mod_fastcgi-2.4.6.tar.gz
#tar zxf mod_fastcgi-2.4.6.tar.gz
#cd mod_fastcgi-2.4.6
#cp Makefile.ap2 Makefile
#vim Makefile  #将Makefile中的路径修改成apache的安装路径
#make install
安装成功之后,会自动讲mod_fastcgi.so复制到apache的modules目录中,修改apache的配置文件
增加:LoadModule fastcgi_module modules/mod_fastcgi.so
<IfMoudle fastcgi_module>
   FastCgiServer /usr/local/apache/cgi-bin/php-cgi -processes 20
   AddType application/x-httpd-php .php
   AddHandler php-fastcgi .php
   Action php-fastcgi /cgi-bin/php-cgi
</IfModule>
重启apache之后,查看进程,就会发现有很多php-cgi进程再运行

2.1)FastCGI模式,用php-fpm进程管理器
添加fastcgi模块到httpd.conf配置文件之后,LoadModule fastcgi_module modules/mod_fastcgi.so
<IfMoudle fastcgi_module>
 FastCgiServer /usr/local/apache/cgi-bin/php-cgi -host 127.0.0.1:9000
 AddType application/x-httpd-php .php
 AddHandler php-fastcgi .php
 Action php-fastcgi /cgi-bin/php-cgi
</IfModule>
我们还需要把php-fpm打开,/usr/local/php5/sbin/php-fpm
重启apache之后,查看进程,会发现很多php-fpm的进程
   想要确定自己当前环境用到的是那种模式:可以在phpinfo()中,查看Server API:Apache 2.0 Handler
作者:一起代码网——阿涛
原文链接:http://www.17codes.com/archives/151
欢迎转载,但请保留作者和本文链接,谢谢!
欢迎在下面的评论区与我交流。

转载请注明:一起代码 » cgi、fastcgi、php-fpm、apache handler模块

喜欢 (2)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址