CGI的知识点
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的知识点的更多相关文章
- 【干货分享】前端面试知识点锦集01(HTML篇)——附答案
一.HTML部分 1.浏览器页面有哪三层构成,分别是什么,作用是什么? 构成:结构层.表示层.行为层分别是:HTML.CSS.JavaScript作用:HTML实现页面结构,CSS完成页面的表现与风格 ...
- Atitit 研发体系建立 数据存储与数据知识点体系知识图谱attilax 总结
Atitit 研发体系建立 数据存储与数据知识点体系知识图谱attilax 总结 分类具体知识点原理规范具体实现(oracle,mysql,mssql是否可以自己实现说明 数据库理论数据库的类型 数据 ...
- Atitit 编程语言知识点tech tree v2 attilax大总结
Atitit 编程语言知识点tech tree v2 attilax大总结 大分类中分类小分类知识点原理与规范具体实现(javac#里面的实现phpjsdsl(自己实现其他语言实现 类与对象实现对象实 ...
- 【经验之谈】前端面试知识点总结(HTML相关)——附答案
目录 一.HTML部分 1.浏览器页面有哪三层构成,分别是什么,作用是什么? 2.HTML5的优点与缺点? 3.Doctype作用? 严格模式与混杂模式如何区分?它们有何意义? 4.HTML5有哪些新 ...
- php中高级基础知识点
1. 基本知识点 HTTP协议中几个状态码的含义:1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态代码. 代码 说明 100 (继续) 请求者应当继续提出请求. 服务器返回此代码 ...
- Servlet&JSP中的知识点
先sun提出的是Servlet体系,这个体系使得使用JAVA的程序员也能开发基于B/S架构的WEB应用程序,使用Servlet类将HTTP请求和响应封装在标准JAVA类中来实现各种WEB应用方案.随着 ...
- Java---常用基础面试知识点
综合网上的一点资源,给大家整理了一些Java常用的基础面试知识点,希望能帮助到刚开始学习或正在学习的学员. 1.抽象 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方 ...
- Java面试知识点总结及解析
声明:有人说, 有些面试题很变态,个人认为其实是因为我们基础不扎实或者没有深入.本篇文章来自一位很资深的前辈对于最近java面试题目所做的总结归纳,有170道题目 ,知识面很广 ,而且这位前辈对于每个 ...
- 关于ASP.NET页面事件的知识点
ASP是动态服务器页面(ActiveServerPage)的英文缩写,是微软公司开发的代替CGI脚本程序的一种应用,它可以与数据库和其它程序进行交互,是一种简单.方便的编程工具.那么关于ASP.NET ...
随机推荐
- 给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x ...
- c标准库 徐明远 背景基础
背景基础 1.c语言库用c语言编写 其他语言则不同 早期语言的库是用汇编语言编写的 不同的计算机体系结构有不同的汇编语言 所以在移植性方面差一点 而c语言可以编写出高度可移植性的代码 ...
- hlg 1580 tell me the length
智力题,观察上一行,有几个数字. 比如,S[1]=1; S[2]=11; S[3]=21; S[4]=1211; 这样就可以观察出来,序列一是1个1 ---> S[2] = 11 ; 序列二是 ...
- java面向抽象编程样例
import java.util.*; abstract class Geometry{ public abstract double getArea(); } class Pillar ...
- Python之静态语法检查
Python是一门动态语言.在给python传参数的时候并没有严格的类型限制.写python程序的时候,发现错误经常只能在执行的时候发现.有一些错误由于隐藏的比较深,只有特定逻辑才会触发,往往导致需要 ...
- 【2018.9.20】JOI 2017 Final T3「JOIOI 王国 / The Kingdom of JOIOI」
题目链接 题目描述 JOIOI 王国是一个 $H$ 行 $W$ 列的长方形网格,每个 $1\times 1$ 的子网格都是一个正方形的小区块.为了提高管理效率,我们决定把整个国家划分成两个省 $JOI ...
- POJ1635 树的最小表示法(判断同构)
Some major cities have subway systems in the form of a tree, i.e. between any pair of stations, ther ...
- C/C++ 程序中调用命令行命令并获取命令行输出结果
在 c/c++ 程序中,可以使用 system()函数运行命令行命令,但是只能得到该命令行的 int 型返回值,并不能获得显示结果.例如system(“ls”)只能得到0或非0,如果要获得ls的执行结 ...
- 洛谷试炼场 提高模板-nlogn数据结构
树状数组-区间求和 P3374 [模板]树状数组 1 /*by SilverN*/ #include<algorithm> #include<iostream> #includ ...
- 【索引】理解MySQL——索引与优化
MySQL 索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索 ...