CGI的一些知识点

CGI(Common Gateway Interface)是能让web服务器和CGI脚本共同处理客户的请求的协议。它的协议定义文档是http://www.ietf.org/rfc/rfc3875

其中Web服务器负责管理连接,数据传输,网络交互等。至于CGI脚本就负责管理具体的业务逻辑。

Web服务器的功能是将客户端请求(HTTP Request)转换成CGI脚本请求,然后执行脚本,接着将CGI脚本回复转换为客户端的回复(HTTP Response)。

CGI的脚本请求有两部分:请求元数据(request meta-variables)和相关的消息体(message-body)。

请求元数据

包含:

                               "AUTH_TYPE" | "CONTENT_LENGTH" |
                           "CONTENT_TYPE" | "GATEWAY_INTERFACE" |
                           "PATH_INFO" | "PATH_TRANSLATED" |
                           "QUERY_STRING" | "REMOTE_ADDR" |
                           "REMOTE_HOST" | "REMOTE_IDENT" |
                           "REMOTE_USER" | "REQUEST_METHOD" |
                           "SCRIPT_NAME" | "SERVER_NAME" |
                           "SERVER_PORT" | "SERVER_PROTOCOL" |
                           "SERVER_SOFTWARE" | scheme |
                           protocol-var-name | extension-var-name
 
下面一个一个看:
 
AUTH_TYPE是唯一标识了用户的认证方式,比如basic,Digest等
CONTENT_LENGTH是请求消息体的长度
CONTENT_TYPE是标识消息体的格式
GATEWAY_INTERFACE标识使用的CGI的版本,比如CGI/1.1
PATH_INFO说明了解释CGI脚本的地址
PATH_TRANSLATED就是可以被访问的cgi的路径,它对应CGI脚本的路径,比如
http://somehost.com/cgi-bin/somescript/this%2eis%2epath%3binfo
对应的PATH_INFO就是/this.is.the.path;info
QUERY_STRING 请求参数(GET的参数就是放在这个里面的)
REMOTE_ADDR标识客户端的ip地址
REMOTE_HOST标识的是客户端的域名
REMOTE_IDENT是发出请求的使用者标示,大多数服务端选择忽略这个属性
REMOTE_USER是使用者的合法名称
REQUEST_METHOD是请求方法,包括GET/POST/PUT/DELETE等
SCRIPT_NAME是脚本程序的虚拟路径,比如是/test/test.php
SERVER_NAME是WEB服务器的域名
SERVER_PORT是WEB服务器端口名
SERVER_PROTOCOL是WEB服务器与客户端的交互请求协议
SERVER_SOFTWARE发送给客户端的response的Web服务器的标识,比如nginx/1.0.6

请求消息体

就是直接将客户端的请求消息体转发,将消息体放在stdin中传递给script的
 

相关知识点

参数传递

下面的问题就是web服务器获取了http请求后,由于http请求是有分GET和POST等方法的。参数怎么传递给可执行程序呢?
比如GET方法,CGI程序就会从环境变量QUERY_STRING中获取数据。
POST呢?Web服务器会通过stdin(标准输入)想CGI中传送数据的。而传送的数据长度就是放在CONTENT_LENGTH中的。
对应于HTTP请求,QUERY_STRING存放http的GET参数,stdin存放HTTP的BODY参数

现在流行的nginx+php的方法就是使用nginx(web服务器)将请求变成cgi请求到php-cgi上,然后php-cgi进程执行php,将返回值变成cgi response返回给nginx。nginx再将它变成http回复返回给客户端。

但是这里有个问题,cgi是单进程的,一个进程的生命期就只是请求进来,处理,返回回复这几个阶段。但是web服务器都是需要接受多个web请求的,这里就需要在后端开启多个cgi了。一般的cgi服务器都会设置允许开启多少个cgi的数量的。

这里要明确一点,cgi是有分服务端和客户端的区别的,cgi客户端是放在web服务器一侧,像nginx,apache这样的web服务器就已经是实现了这个客户端。服务器端需要另外重启。像nginx+cgi+php这样的配合就需要启动php-cgi服务,当然你也可以想到这样的服务一定是以deamon的形式在后台运行,然后会fork出很多个cgi进程。
 

复用

当然有人会问,cgi进程不能复用是个问题,为什么不呢,fastcgi出现就是解决了这个问题。它的一个进程可以处理多个请求。这样速度当然就升上去了。然后还有一种cgi是scgi(simple cgi),scgi和fastcgi相似,只能说它定义的协议更简单(所以才叫做simple)。scgi的客户端是c写的,服务端是perl写的。
就最常见的nginx+cgi+php来说,要明确一点php中$_SERVER中获取的信息实际都是从cgi中获取的,当然这个和nginx中获取的客户端信息是一致的。另外由于cgi是有客户端和服务端的区别的,因此很容易想到cgi客户端需要使用tcp与客户端连接,每个连接当然需要占用一个端口,因此还是会有端口限制的。所以从这个角度上说,并不是cgi开的越多越好(当然6w的端口限制是远远够的了)。
 

安全

关于开启的cgi安全问题,曾经鸟哥就爆出了一个bug:http://www.laruence.com/2010/05/20/1495.html
有兴趣的读者可以看看。
 
还有cgi服务器不是在监听端口吗?怎么防止外网的请求执行cgi呢?我们一般的办法就是直接绑定在127.0.0.1的ip地址上,保证只有本机才能访问
时间: 2024-09-17 19:12:11

CGI的一些知识点的相关文章

Go中的CGI包使用

Go中包含有CGI包,net/http/cgi,这篇文章就是来阅读和使用这个包.关于cgi的参数和运行,可以看这篇文章:CGI的一些知识点 CGI包阅读 cgi包的存在就告诉我们一件事情,cgi服务端和客户端完全可以使用Go来写 这个包其实很简单,只有两个文件,其他都是测试程序 child.go host.go   host.go是可以直接宿主到go的web服务器上的代码,里面提供了对request和response的直接处理函数ServerHTTP, 当你是使用go的http包写了个http之

Java---常用基础面试知识点

综合网上的一点资源,给大家整理了一些Java常用的基础面试知识点,希望能帮助到刚开始学习或正在学习的学员. 1.抽象 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象. 2.继承 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法. 对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继 承了原始类的特性,新

/usr/bin/ld: cannot find -lltdl collect2: ld returned 1 exit status make: *** [sapi/cgi/php-cgi] Err

/usr/bin/ld: cannot find -lltdl collect2: ld returned 1 exit status make: *** [sapi/cgi/php-cgi] Error 1 解决办法:  yum install *ltdl*

jquery-jQuery一个小知识点,求教

问题描述 jQuery一个小知识点,求教 本来不想麻烦大神的,今天看视频教程$().ready(function(){ }); 和$(document).ready(function(){ });我百度了没有明确结果,希望比较懂Js的大神告诉我一声,这两个是不是一样的 解决方案 两者效果是一样的,当没有写document的时候,默认就是选中document$().ready(function () { } )与javascript中的onload=function ( ){ };效果也是一样的

Python易忽视知识点小结

  这篇文章主要介绍了Python易忽视知识点,实例分析了Python中容易被忽视的常见操作技巧,需要的朋友可以参考下 这里记录Python中容易被忽视的小问题 一.input(...)和raw_input(...) ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #简单的差看帮助文档input(...)和raw_input(...)有如下区别 >>> help(input) Help o

JavaScript的21条基本知识点

这篇文章主要介绍了JavaScript的21条基本知识点的相关资料,需要的朋友可以参考下 1.JavaScript大小写敏感; 2.声明变量如果不写var,则为声明了全局变量;任何不是方法的函数,都是全局变量,其里面的this都指向window; 3.%运算符,求余数,保留整数,y=5;x=y%2;则x=1; 4.如需把两个或多个字符串变量连接起来,请使用 + 运算符,区别于php; 5.三目运算:greeting=(visitor=="PRES")?"Dear Presid

WML学习(七):CGI编程

cgi|编程 CGI编程 1)在WEB服务器上添加WML的MIME类型 对于IIS4,可在其管理器里的站点属性中加入新的MIME类型,后缀.wml和 MIME类型text/vnd.wap.wml. 对于PWS,可修改注册表,先在 HKEY_CLASSES_ROOT层加入主键.wml,再加入串值Content Type为text/vnd.wap.wml,然后在HKEY_LOCAL_MACHINE\Software\CLASSES\MIME\Database\Content Type\中加入主键te

PHP 类的一些知识点

1.类的定义 items[$artnr += $num; } } 不能将一个类分开定义在多个文件,也不能将类定义分到多个PHP块(函数内部可以分). 不能定义名为以下的类: stdClass __sleep __wakeup 事实上不要以__开头定义类. 2.构造函数 class Cart { var $todays_date; var $name; var $owner; var $items = array(VCR, TV); function Cart() { $this->todays_

浅析Apache中SSI和CGI的设定方法

apache|cgi 由于Apache具有相当高的可移植性,它支持超过30种操作系统,包括Unix.Windows 及Darwin等系统,所以目前在网络上已注册的网域里大部份是使用Apache网页服务器.目前ApacheSoftware Foundation 正致力于发展现在已进入alpha测试阶段的Apache2.0.在这里,我和大家探讨如何修改服务器选项让服务器能提供简单的动态网页内容,也就是支持CGI程序及 Server-Side Include(SSI)程序. 1.准备工作 首先,我假设