cgi fast-cgi fpm概念

最早的Web服务器简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏览器,也就是静态html。事物总是不 断发展,网站也越来越复杂,所以出现动态技术。但是服务器并不能直接运行 php,asp这样的文件,自己不能做,外包给别人吧,但是要与第三做个约定,我给你什么,然后你给我什么,就是握把请求参数发送给你,然后我接收你的处 理结果给客户端。那这个约定就是 common gateway interface,简称cgi。这个协议可以用vb,c,php,python 来实现。cgi只是接口协议,根本不是什么语言。拜 CGI 之赐,网站不再只有固定不变的图形和文字,藉由程序动态产生的网页可以让网站好象『活』了起来。

那么 CGI 程序的性能问题在哪呢?每个请求过来,php CGI程序都会重新fork一个php解释器进程,接下来后者会解析 php.ini 文件,初始化执行环境,这种方法非常容易实现,但效率很差,所以CGI模式已经很少使用了。

然后就有了fast-cgi,它也是与语言无关的一种协议是web server与应用程序之间的一种新的协作模式。而cgi则难称为一种模式。fastCgi 会先启一个 master(守护进程),解析配置文件,初始化执行环境,然后再启动多个 worker(php-cgi子进程)。当请求过来时,master 会传递给一个 worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当 worker 不够用时,master 可以根据配置预先启动几个 worker 等着;当然空闲 worker 太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是 fastCgi 对进程的管理。这是fastcgi作为cgi的替代技术标准的优点之一,即进程池管理。一个php-fpm进程(fastcgi进程)即php-cgi子进程只包含一个线程,不支持多线程

除了进程池管理,fast-cgi将HTTP服务器和脚本解析服务器(fasgcgi服务器和php-cgi进程,这两者又是一个次C/S结构)分开。抽象成C/S架构。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。意思是,当进来一个请求时,web服务器把环境变量和这个页面请求通过一个socket比如FastCGI进程与web服务器(都位于本地)或者一个TCP connection(FastCGI进程在远端的server farm)传递给FastCGI服务器,经过进程调度传递给fastcgi进程。这就把动态语言和HTTP Server分离开来,所以Nginx与PHP/PHP-FPM经常被部署在不同的服务器上,以分担前端Nginx服务器的压力,使Nginx专一处理静态请求和转发动态请求,而PHP/PHP-FPM服务器专一解析PHP动态请求。


从上面的阐述可知,fascgi包括三方:web server需要遵循C/S规则、参数传递协议。fastcgi服务器负责请求的进出以及php-cgi进程管理。php需要支持fascgi参数传递协议。多数流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等,同时,FastCGI也被许多脚本语言所支持,其中就有PHP。

fastcgi协议的多方实现:

php-fpm是fast-cgi服务器的一种实现,现在不需要作为补丁安装,已经集成在php内核中。在PHP环境下配置完php-fpm之后,有两种方式启动fastcgi进程:

/usr/local/php/bin/php-cgi --fpm   

/usr/local/php/sbin/php-fpm  start 

由于nginx本身不会对PHP进行解析,因此要实现Nginx对PHP的支持,其实是将对PHP页面的请求交给fastCGI进程监听的IP地址及端口。如果把php-fpm当做动态应用服务器,那么Nginx其实就是一个“反向代理服务器”。Nginx通过反向代理功能实现对PHP的解析,这就是Nginx实现PHP动态解析的原理,一个可能的配置如下:


location ~ \.php$ {  

            root           html;  

            fastcgi_pass   127.0.0.1:9000;  

            fastcgi_index  index.php;  

            fastcgi_param  SCRIPT_FILENAME  html$fastcgi_script_name;  

            include        fastcgi_params;  

        }  


通过location指令,将所有以php为后缀的文件都交给127.0.0.1:9000来处理,而这里的IP地址和端口就是FastCGI进程监听的IP地址和端口。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值