http://www.web008.net

粗略表达CGI是如何,不难表明CGI和动态央求是何等

3. web server和CGI的相互格局

web server对cgi进度/线程来讲,它的效果正是倡导动态管理伏乞,传递一些参数和情状变量,最终收到cgi的回到结果。再通俗而不谨严地说,web server通过cgi/fastcgi共商将动态央浼转载给实施cgi脚本的应用程序。通过上面httpd.conf中的转载配置相应十分轻便领悟(httpd和php-fpm的互相卡塔尔国:

ProxyRequests off
ProxyPassMatch ^/(.*.php)$ fcgi://127.0.0.1:9000/usr/local/apache/htdocs/$1

以最规范的apache httpd和php为例,对于httpd来讲,web server和php-cgi有3种相互方式。

  • cgi模式:httpd接纳到二个动态央浼就fork二个cgi进程,cgi进度重回结果给httpd进度后本人销毁。
  • 动态模块模式:将php-cgi的模块(例如php5_module卡塔尔(英语:State of Qatar)编译进httpd。在httpd运营时会加载模块,加载时也将相应的模块激活,php-cgi也就开发银行了。(注:改革四个非常小错误,很四人认为动态编写翻译的模块是足以在急需的时候任何时候加载调用,没有需求的时候它们就停止了,实际上不是这么的。和静态编写翻译的模块相符,动态加载的模块在被加载时就被投入到激活链表中,无论是还是不是使用它,它都曾经运行在apache httpd的中间。可参照LoadModule指令的法定手册卡塔尔国
  • php-fpm模式:使用php-fpm管理php-cgi,此时httpd不再调整php-cgi进度的起步。能够将php-fpm独立运营在非web服务器上,实现所谓的事态抽离。

实则,依靠模块mod_fastcgi还是能实现fastcgi方式。同cgi肖似,管理格局的自然破绽调控了这实际不是豆蔻年华种好点子。

3.2 模块方式

在编译php时,将php5_module模块编写翻译到apache中,举个例子在编写翻译php时在./configure配置中丰盛"--with-apxs2=/usr/local/apache/bin/apxs"。

这种互相方式下,httpd在运维时加载并激活php_module。约等于说,php-cgi常驻在httpd进度之中。当动态央浼达到时,httpd不用再生成cgi解释器,而是直接将动态必要转载给它里面php-cgi。

配备实用这种相互情势非常轻巧,只需采纳LoadModule加载php_module,再增添对应的MIME微型机就能够。

LoadModule php5_module modules/libphp5.so

# 在mime模块中添加对应的类型
<IfModule mime_module>
AddType application/x-httpd-php .php
AddType applicaiton/x-httpd-php-source .phps
</IfModule>

2.各类术语释疑

说真话,对于三个没接触过编制程序语言的人的话,刚接触cgi概念的时候一定会有一批难题,那到底是怎么样鬼,管理动态内容的东西不是像php一样的应用程序吗,跟cgi有几毛钱关系,fastcgi又是何等?笔者想,非科班出身的人格障碍病者(包含自家卡塔尔国一定会被这几个概念折腾的痛定思痛。

以php为例,我将三回动态央浼相关的定义差相当的少都简单解释一回。

  1. cgi:它是豆蔻梢头种公约。通过cgi共同商议,web server能够将动态供给和连锁参数发送给特地处理动态内容的应用程序。
  2. fastcgi:也是意气风发种公约,只可是是cgi的优化版。cgi的属性较烂,fastcgi则在其底子上拓宽了改革。
  3. php-cgi:fastcgi是后生可畏种合同,而php-cgi达成了这种契约。不过这种完毕比较烂。它是单进度的,一个历程管理三个号令,处理达成后经过就销毁。
  4. php-fmp:是对php-cgi的改过版,它直接保管三个php-cgi进度/线程。也正是说,php-fpm是php-cgi的长河微处理机所以它也终于fastcgi合同的落到实处。在自然水准上讲,php-fpm与php的涉及,和tomcat对java的关联是相似的。
  5. cgi进程/线程:在php上,就是php-cgi进程/线程。特意用来吸收接纳web server的动态伏乞,调用并开端化zend虚构机
  6. cgi脚本:被履行的php源代码文件。
  7. zend虚拟机:对php文件做词法剖判、语法解析、编写翻译成opcode,并奉行。最后关闭zend设想机。
  8. cgi进程/线程和zend虚拟机的关系:cgi进度调用并初始化zend设想机的各样情况。

以php-fpm为例,web server从转载动态诉求到停止的过程大约如下:

图片 1

而各类php-cgi进程的功用差不离包蕴:(有个别效益分类错误,请无视,知道大约效率就够了卡塔尔国

图片 2

瞩目,即使php-fpm的全称为PHP 法斯特CGI Process Manager,但严苛地讲,php-fpm不是fastcgi的长河微处理器,而是php fastcgi即php-cgi的长河微机。fastcgi只是风华正茂种合同,不是进程。就如http合同同样,apache对它的落实是httpd,nginx对它的得以达成就叫nginx。

双重表达,cgi和fastcgi是一种合同。各类帮助和WEB人机联作的编制程序语言对cgi/fastcgi协商都做了各自的得以完成(当然,任何大器晚成种语言都能写cgi脚本卡塔尔国,而php上的php-cgi和php-fpm正是php对fastcgi公约的兑现。

归来Linux类别小说大纲: 回到网址构造连串文章大纲: 回到数据库种类随笔大纲: 转发请申明出处:

3.3 php-fpm方式

眼下说了,php-fpm是php-cgi的进程微处理机。这种交互作用情势实际上是让php-cgi以单独于httpd的主意存在,这段时间基本选拔php-fpm的秘籍管理php-cgi进度。也正是说,这种情势下,php-cgi和httpd已经分开了,它们的分别意味着伏乞的意况抽离变为大概:httpd和php-fpm分别运维在不相同服务器上。动静分离后,压力也疏散到个其他服务器上。

要让php-fpm以这种方法运转,供给在编写翻译的./configure配置选项中增多"--enable-fpm"选项。当然,还得运行php-fpm服务。举个例子:

service php-fpm start

那样php-cgi进度就开放着端口(私下认可9000卡塔尔国等待httpd转载动态必要。要让httpd能够转载倡议到php-cgi上,必要在httpd.conf中关闭正向代理,并安装fastcgi合同代理参数。举个例子,转载到192.168.100.54主机上的php-fpm。

# 加载代理模块
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

# 添加MIME类型
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

# 在需要转发的虚拟主机中配置转发代理
ProxyRequests off
ProxyPassMatch ^/(.*.php)$ fcgi://192.168.100.54:9000/usr/local/apache/htdocs/$1

3.3 php-fpm方式

前面说了,php-fpm是php-cgi的长河管理器。这种人机联作方式实际上是让php-cgi以独立于httpd的主意存在,最近主导使用php-fpm的秘诀管理php-cgi进度。也正是说,这种格局下,php-cgi和httpd已经分别了,它们的分手意味着诉求的图景抽离变为大概:httpd和php-fpm分别运转在不一样服务器上。动静抽离后,压力也疏散到个别的服务器上。

要让php-fpm以这种措施运营,必要在编写翻译的./configure配置选项中加多"--enable-fpm"选项。当然,还得运营php-fpm服务。比如:

service php-fpm start

这么php-cgi进度就开放着端口(暗中认可9000卡塔尔等待httpd转载动态央浼。要让httpd能够转载呼吁到php-cgi上,必要在httpd.conf中关闭正向代理,并设置fastcgi合同代理参数。比如,转发到192.168.100.54主机上的php-fpm。

# 加载代理模块
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

# 添加MIME类型
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

# 在需要转发的虚拟主机中配置转发代理
ProxyRequests off
ProxyPassMatch ^/(.*.php)$ fcgi://192.168.100.54:9000/usr/local/apache/htdocs/$1

 

1. CGI是什么

CGI是common gateway interface的缩写,我们都译作通用网关接口,但很衰颓,大家不恐怕见名知意。

大家通晓,web服务器所拍卖的原委都以静态的,要想管理动态内容,要求依赖于web应用程序,如php、jsp、python、perl等。然则web server如何将动态的乞请传递给那几个应用程序?它所依赖的正是cgi合计。没有错,是钻探,也正是web server和web应用程序交换时的正统。换句话说,通过cgi商业事务,再组成已搭建好的web应用程序,就足以让web server也能"管理"动态央浼(只怕说,当客商访谈有个别特定财富时,能够触发施行有个别web应用程序来贯彻特定效用卡塔尔,你明确晓得管理两字怎么要增多双引号。

同理可得版的cgi工作方式如下:

图片 3

例如说,在Google寻找栏中寻觅三个最首要词"http",对应的UTucsonL为:

https://www.google.com/search?q=http&oq=http&aqs=chrome..69i57j69i60l4j0.1136j0j8&sourceid=chrome&ie=UTF-8

当谷歌(Google卡塔尔的web server收到该诉求后,先解析该url,从当中领略了要实施search程序,并且还知道了黄金年代体系要传送给search的参数及其相应的value。web server会将那一个程序参数和别的一些意况变量依照cgi商讨通过TCP或套接字等办法传递给已运行的cgi程序(恐怕是cgi进程,恐怕是已加载的模块cgi模块卡塔尔。当cgi进度选拔到web server的伸手后,调用search程序并实践,同一时间还有或者会传递参数给search程序。search实践实现后,cgi进程/线程将处理结果重临给web server,web server再回去给浏览器。

有三种办法得以实践cgi程序,但对http的伏乞方法来讲,独有get和post二种方式允许奉行cgi脚本(即下面的search程序卡塔尔国。实际上post方法的中间本质照旧get方法,只然而在出殡和安葬http乞求时,get和post方法对url中的参数管理情势不后生可畏致而已。

其余生龙活虎种语言都能编写CGI,只可是有些语言相比专长,有个别语言则不行麻烦,例如用bash shell开采,那么必要用echo等打字与印刷语句将施行结果放在巨多无比的html的价签中输出给客商端。常用来编写CGI的语言有perl、php、python等,java也相似能写,但java的servlet完全能贯彻CGI的功用,且更优化、更利于开辟。

注:若你感到这篇作品还不易请点击右下角推荐,您的扶助能激发小编越来越大的创作热情,非常谢谢!

本文目录: 1. CGI是如何 2. 各样术语解释 3. web server和CGI的交互作用形式 3.1 CGI形式 3.2 模块形式 3.3 php-fpm情势...

郑重声明:本文版权归美高梅163888所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。