CGI(Common Gateway Interface)是能让webserver和CGI脚本共同处理客户的请求的协议。

它的协议定义文档是http://www.ietf.org/rfc/rfc3875

当中Webserver负责管理连接,传输数据,网络交互等。

至于CGI脚本就负责管理详细的业务逻辑。

Webserver的功能是将client请求(HTTP Request)转换成CGI脚本请求。然后运行脚本,接着将CGI脚本回复转换为client的回复(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标识client的ip地址
REMOTE_HOST标识的是client的域名
REMOTE_IDENT是发出请求的使用者标示,大多数服务端选择忽略这个属性
REMOTE_USER是使用者的合法名称
REQUEST_METHOD是请求方法,包含GET/POST/PUT/DELETE等
SCRIPT_NAME是脚本程序的虚拟路径。比方是/test/test.php
SERVER_NAME是WEBserver的域名
SERVER_PORT是WEBserverport名
SERVER_PROTOCOL是WEBserver与client的交互请求协议
SERVER_SOFTWARE发送给client的response的Webserver的标识。比方nginx/1.0.6

请求消息体

就是直接将client的请求消息体转发。将消息体放在stdin中传递给script的
 

相关知识点

參数传递

以下的问题就是webserver获取了http请求后。因为http请求是有分GET和POST等方法的。參数怎么传递给可运行程序呢?
比方GET方法,CGI程序就会从环境变量QUERY_STRING中获取数据。
POST呢?Webserver会通过stdin(标准输入)想CGI中传送数据的。而传送的数据长度就是放在CONTENT_LENGTH中的。
相应于HTTP请求。QUERY_STRING存放http的GET參数,stdin存放HTTP的BODY參数

如今流行的nginx+php的方法就是使用nginx(webserver)将请求变成cgi请求到php-cgi上,然后php-cgi进程运行php,将返回值变成cgi response返回给nginx。

nginx再将它变成http回复返回给client。

可是这里有个问题,cgi是单进程的,一个进程的生命期就仅仅是请求进来。处理。返回回复这几个阶段。可是webserver都是须要接受多个web请求的,这里就须要在后端开启多个cgi了。一般的cgiserver都会设置同意开启多少个cgi的数量的。

这里要明白一点,cgi是有分服务端和client的差别的,cgiclient是放在webserver一側,像nginx。apache这种webserver就已经是实现了这个client。

server端须要另外重新启动。像nginx+cgi+php这种配合就须要启动php-cgi服务,当然你也能够想到这种服务一定是以deamon的形式在后台执行,然后会fork出非常多个cgi进程。
 

复用

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

安全

关于开启的cgi安全问题。以前鸟哥就爆出了一个bug:http://www.laruence.com/2010/05/20/1495.html
有兴趣的读者能够看看。
 
还有cgiserver不是在监听port吗?怎么防止外网的请求运行cgi呢?我们一般的办法就是直接绑定在127.0.0.1的ip地址上。保证仅仅有本机才干訪问

參考文档:

http://www.lyinfo.net.cn/webclass/cgi/default.htm
http://blog.csdn.net/ablo_zhou/article/details/3634954
http://www.ietf.org/rfc/rfc3875

CGI的知识点的更多相关文章

  1. 【干货分享】前端面试知识点锦集01(HTML篇)——附答案

    一.HTML部分 1.浏览器页面有哪三层构成,分别是什么,作用是什么? 构成:结构层.表示层.行为层分别是:HTML.CSS.JavaScript作用:HTML实现页面结构,CSS完成页面的表现与风格 ...

  2. Atitit 研发体系建立 数据存储与数据知识点体系知识图谱attilax 总结

    Atitit 研发体系建立 数据存储与数据知识点体系知识图谱attilax 总结 分类具体知识点原理规范具体实现(oracle,mysql,mssql是否可以自己实现说明 数据库理论数据库的类型 数据 ...

  3. Atitit 编程语言知识点tech tree v2 attilax大总结

    Atitit 编程语言知识点tech tree v2 attilax大总结 大分类中分类小分类知识点原理与规范具体实现(javac#里面的实现phpjsdsl(自己实现其他语言实现 类与对象实现对象实 ...

  4. 【经验之谈】前端面试知识点总结(HTML相关)——附答案

    目录 一.HTML部分 1.浏览器页面有哪三层构成,分别是什么,作用是什么? 2.HTML5的优点与缺点? 3.Doctype作用? 严格模式与混杂模式如何区分?它们有何意义? 4.HTML5有哪些新 ...

  5. php中高级基础知识点

    1. 基本知识点 HTTP协议中几个状态码的含义:1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态代码. 代码   说明 100   (继续) 请求者应当继续提出请求. 服务器返回此代码 ...

  6. Servlet&JSP中的知识点

    先sun提出的是Servlet体系,这个体系使得使用JAVA的程序员也能开发基于B/S架构的WEB应用程序,使用Servlet类将HTTP请求和响应封装在标准JAVA类中来实现各种WEB应用方案.随着 ...

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

    综合网上的一点资源,给大家整理了一些Java常用的基础面试知识点,希望能帮助到刚开始学习或正在学习的学员. 1.抽象 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方 ...

  8. Java面试知识点总结及解析

    声明:有人说, 有些面试题很变态,个人认为其实是因为我们基础不扎实或者没有深入.本篇文章来自一位很资深的前辈对于最近java面试题目所做的总结归纳,有170道题目 ,知识面很广 ,而且这位前辈对于每个 ...

  9. 关于ASP.NET页面事件的知识点

    ASP是动态服务器页面(ActiveServerPage)的英文缩写,是微软公司开发的代替CGI脚本程序的一种应用,它可以与数据库和其它程序进行交互,是一种简单.方便的编程工具.那么关于ASP.NET ...

随机推荐

  1. spring配置druid连接池和监控数据库访问性能

    Druid连接池及监控在spring配置如下: <bean id="dataSource" class="com.alibaba.druid.pool.DruidD ...

  2. NOIP一系列模拟赛小结

    NOIP越发接近了,于是自己也跟着机房的几位师兄一起做了几次NOIP模拟赛,收获颇多. #1-T1:求点集中的点能否只用三条与坐标轴平行的直线就能全部被经过,其实只要将横纵坐标排序后逐个点检查下就行. ...

  3. spring之scope作用域

    spring中,bean的作用域有五种类型:默认是单例模式,         singleton         prototype         request         session   ...

  4. hdu5396 Expression

    Expression Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  5. Centos 安装Python3的方法

    由于centos7原本就安装了Python2,而且这个Python2不能被删除,因为有很多系统命令,比如yum都要用到. [root@VM_105_217_centos Python-3.6.2]# ...

  6. 洛谷 [P3265] 装备购买

    线性基 通过题目描述可以感觉到就是要求线性基, 线性基的求法是高斯消元,消完以后剩下的x的系数非 0 的就是线性基 本题有一个贪心策略,每次挑选价格最小的来消掉其他的元 //可以快排预处理 #incl ...

  7. 实战分析Tomcat的类加载器结构(使用Eclipse MAT验证)

    一.前言 在各种Tomcat相关书籍,书上都提到了其类加载器结构: 在Tomcat 7或者8中,共享类和Catalina类加载器在catalina.properties中都是没配置的,请看: 所以,c ...

  8. toolbarlite随笔之插件的闭包写法

    toolbarlite这个东西至今没搞懂是什么玩意.因为除了源代码我实在是找不到除了toolbar之外的任何关于toolbarlite的东西了.不知道toolbarlite是不是toolbar的子集, ...

  9. 关于整合spring+mybatis 第二种方式

    和第一种方式一样的步骤,不过bean.xml中有些许差异 <!-- 配置sqlSessionFactory --> <bean id="sqlSessionFactory& ...

  10. hdu 4587 2013南京邀请赛B题/ / 求割点后连通分量数变形。

    题意:求一个无向图的,去掉两个不同的点后最多有几个连通分量. 思路:枚举每个点,假设去掉该点,然后对图求割点后连通分量数,更新最大的即可.算法相对简单,但是注意几个细节: 1:原图可能不连通. 2:有 ...