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 ...
随机推荐
- A Survey of Model Compression and Acceleration for Deep Neural Network时s
A Survey of Model Compression and Acceleration for Deep Neural Network时s 本文全面概述了深度神经网络的压缩方法,主要可分为参数修 ...
- 性能学习之--loaderunner中run-time setting常用功能
先打开run-time setting界面 一.Run Logic 设置迭代次数,只控制action的迭代次数,init和end只执行一次. 如果迭代次数设置10,10个并发用户,那么init和e ...
- Luogu【P1130】红牌(DP)
欧拉 本蒟蒻第一个自己想出来的DP题 请移步题目链接 调了半天.i从1到n,j从1到m. f[i][j]表示的是第i道工序在第j个小组办完所花的最短时间. 因为要用到上一个状态,而上一个状态要么是同一 ...
- 3931: [CQOI2015]网络吞吐量【网络流】
网络吞吐量(network)题目描述路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最快的到达目的地,路 ...
- oracle 当中,(+)是什么意思
SELECT A.id, B.IDDFROM A, BWHERE A.id(+)=B.IDD等价于SELECT A.id, B.IDDFROM A RIGHT OUTER JOIN B ON ( A. ...
- jenkins使用流程
jenkins使用流程 看下面那个连接的吧. http://www.cnblogs.com/zz0412/p/jenkins02.html 1.设置git库 2.点击add添加github用户名.密码 ...
- LA 3263 平面划分
Little Joey invented a scrabble machine that he called Euler, after the great mathematician. In his ...
- Mysql 实现篮球比赛赛程中两支队伍的查询
表结构如下: 查询两支队伍的比赛情况,sql语句如下: SELECT t1.team_name,g.team1_score,g.team2_score,t2.team_name,g.gametime ...
- Codevs 1299 切水果 水一发
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 简单的说,一共N个水果排成一排,切M次,每次切[L,R]区间的所有水果(可能有的 ...
- Codevs 2801 LOL盖伦的蹲草计划
题目描述 Description 众所周知,LOL这款伟大的游戏,有个叫盖伦的英雄.他的伟大之处在于他特别喜欢蹲草丛阴人(XL:蹲草阴人也算英雄?!CZQ:没办法,个个都是这么玩的).某日,德玛西亚与 ...