【Web学习笔记】浅析CGI概念及用法
1. CGI是什么
CGI是Common Gateway Interface的简写,它提供了一种标准方法使得位于WebServer后端的web应用可以根据client的请求动态生成网页内容。在互联网应用常见的C-S模式中,从Server角度来看,CGI提供了WebServer和生成具体内容的Web程序之间的接口,具体实现CGI标准协议的程序称为CGI脚本(因为它们通常是用脚本语言实现的)或简称CGI。
可见,严格意义上的CGI其实是一个标准(详见
CGI-RFC-Doc
),而我们经常听到的CGI其实是指实现CGI标准的CGI程序(可能由脚本语言实
现,也可能由C/C++实现)
。
对于新手来说,有必要搞清楚CGI的这两重概念,否则可能由于概念不清而导致一头雾水。
关于初学者对CGI的困惑,StackOverflow上有篇有趣且经典的帖子,强烈建议围观:I never really understood: what is
CGI? ,相信对理解CGI的两重概念有帮助。
2. 引入CGI的目的
CGI标准定义了一系列被称为meta-variables的抽象参数,这些meta-variables可描述来自客户端的http请求,从而实现了一个WebServer和后端CGI程序的接口,这个接口是与平台无关的。
由于CGI的存在,WebServer与后端程序得以各司其职:
1) WebServer负责处理HTTP连接、数据传输、网络事件等与客户端请求相关但与具体应用无关的逻辑
2) 后端程序处理应用相关逻辑,根据请求参数动态生成数据并由WebServer返回给客户端
一个典型C-S交互的完整流程如下所述:
WebServer接收来自client的请求并将其请求参数转换为CGI的meta-variables和message-body(如HTTP POST的body数据),接着,根据URI参数来选择合适的CGI程序并调用之以处理用户请求,然后,接收CGI程序返回的结果数据,最后,将数据返回给client。
需要说明的是:在处理client request过程中,WebServer负责实现协议级或传输层的安全认证(如https认证)。
3. 实例说明
以client的http GET请求http://somehost.com/cgi-bin/somescript/this%2eis%2epath%3binfo?param1=hello¶m2=world为例,其可以被抽象为如下格式:
<scheme> "://" <server-name> ":" <server-port> <script-path> <extra-path> "?" <query-string>
根据CGI标准,位于WebServer下游的CGI程序会将该http请求转换为CGI标准定义的一系列meta-variables,例如:
<scheme>:值为"http",对应meta-variables中的SERVER_PROTOCOL
<server-name>:值为"somehost.com",对应SERVER_NAME
<server-port>:默认值80,对应SERVER_PORT
<script-path>:值为"/cgi-bin/somescript/",对应SCRIPT_NAME
<extra-path>:值为"this%2eis%2epath%3binfo",实际上,它是另一个meta变量PATH_INFO的url-encoded形式
<query-string>:值为param1=hello¶m2=world,对应QUERY_STRING
由于CGI程序已经将http请求转换为标准的CGI meta varialbes,故不管后端业务模块是什么语言实现的,它不用再去关心具体的http请求需要怎么解析,只需访问这些meta变量并做对应处理即可。这正是CGI标准及CGI程序的意义所在。
4. 关于CGI的补充说明
传统CGI脚本其实是一段可执行程序,每次执行都会创建新进程。这样就引起一个问题:webserver每次响应client请求,均需创建并运行CGI进程后才能返回结果。在Linux系统中,创建进程的代价是比较高的,尤其是生产环境要求高并发且低延时的情况下,新建进程对系统性能的影响会更加明显。
在这种现实驱动下,出现了两种常见的优化思路:
1) 预先创建(prefork)一系列CGI进程,从而避免每次新建进程。典型代表:FastCGI
2) 业务代码直接以扩展模块的形式嵌入WebServer执行。典型代表:Apache或Nginx的mod_php扩展等
5. CGI实际部署示例
以lighttpd为例,只需在lighttpd.conf中做两处配置即可:
1) 在webserver要加载的扩展模块中指定"mod_proxy_backend_fastcgi",示例如下:
## modules to load
# at least mod_access and mod_accesslog should be loaded
# all other module should only be loaded if really neccesary
# - saves some time
# - saves memory
server.modules = (
"mod_access",
"mod_expire",
"mod_accesslog",
"mod_error_redirect",
"mod_cookie",
"mod_firewall",
"mod_deflate",
"mod_rewrite",
"mod_proxy_core",
"mod_proxy_backend_fastcgi",
"mod_redirect"
)
2) 指定webserver向后端模块转发协议为CGI协议,示例如下:
$HTTP["url"] =~ "\.php" {
proxy-core.balancer = "static"
proxy-core.allow-x-sendfile = "enable"
proxy-core.protocol = "fastcgi"
}
【参考资料】
1. wikipedia - Common Gateway Interface
2. RFC3875 - The Common Gateway Interface (CGI) Version 1.1
3. CGI Programming Is Simple!
4. StackOverflow - I never really understood: what is CGI?
5. wikipedia - FastCGI
======================= EOF ========================
【Web学习笔记】浅析CGI概念及用法的更多相关文章
- Java Web 学习笔记 1
Java Web 学习笔记 1 一.Web开发基础 1-1 Java Web 应用开发概述 1.1.1 C/S C/S(Client/Server)服务器通常采用高性能的PC机或工作站,并采用大型数据 ...
- JAVA Web学习笔记
JAVA Web学习笔记 1.JSP (java服务器页面) 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . JSP全名为Java Server Pages,中文名叫java服务器 ...
- [原创]java WEB学习笔记95:Hibernate 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- java web 学习笔记 编码问题总结
java web 学习笔记 编码问题总结 1.非form表单中提交的中文参数---------------------------传递给Servlet服务器时,默认以iso-8859-1解码 ...
- JavaScript:学习笔记(2)——基本概念与数据类型
JavaScript:学习笔记(2)——基本概念与数据类型 语法 1.区分大小写.Test 和 test 是完全不同的两个变量. 2.语句最好以分号结束,也就是说不以分号结束也可以. 变量 1.JS的 ...
- [原创]java WEB学习笔记11:HttpServlet(HttpServletRequest HttpServletRsponse) 以及关于 Servlet 小结
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- Java Web学习笔记之---EL和JSTL
Java Web学习笔记之---EL和JSTL (一)EL (1)EL作用 Expression Language(表达式语言),目的是代替JSP页面中复杂的代码 (2)EL表达式 ${变量名} ( ...
随机推荐
- JavaScript中的可枚举属性与不可枚举属性
在JavaScript中,对象的属性分为可枚举和不可枚举之分,它们是由属性的enumerable值决定的.可枚举性决定了这个属性能否被for…in查找遍历到. 一.怎么判断属性是否可枚举 js中基本包 ...
- 3.docker学习之docker与虚拟化
虚拟化技术是一个总称,是一系列实现虚拟技术的统称.从广义上来说,虚拟化技术包括了虚拟机技术和容器技术, 所谓虚拟化技术最大的特点就是将一个真实的机器进行虚拟地分割,然后分割出来的部分可以独立使用 ...
- C++对象数组初始化
类对象 数组 初始化可以使用构造函数初始化,同时类有不同的构造函数,可以对类对象数组元素使用不同的构造函数;
- python中django的第一课
今天找遍了,PYTHON项目中的文件,也没发现后台管理的这些页面去哪里修改 原来在pycharm中的外部库中,查找django,最终找到 $python\django\django\contrib\a ...
- [Z] 将samba共享文件夹映射到linux的目录下
Linux系统下访问远程共享资源 使用mount加载共享目录: -把WinXP机器192.168.16.249上的共享目录test001映射到本地目录/wdl/下. -把Linux机器192.168. ...
- Spring MVC起步
1.1跟踪Spring MVC的请求 每当用户在Web浏览器中点击链接或提交表单的时候,请求就开始工作了.对请求的工作描述就像是快递投送员.与邮局投递员或FedEx投送员一样,请求会将信息从一个地方带 ...
- 有关C#中的引用类型的内存问题
对于一个类,如果定义后(记作对象a),将另外一个对象b直接赋值(“a = b”)给它,则相当于将地址赋值给了这个对象.当另外一个对象b不再对这块地址应用时,a由于对这块地址仍在使用,这块地址的指向的栈 ...
- Elasticsearch-2.4.3的单节点安装(多种方式图文详解)
前提: Elasticsearch-2.4.3的下载(图文详解) 1.新建es安装目录 [root@djt002 local]# mkdir elasticsearch [root@djt002 lo ...
- JQuery easyUi datagrid 中 editor 动态设置最大值最小值
前言 近来项目中使用到 easyui 来进行页面设计,感觉挺方便的,但是网上除了api外,其他有价值的资料比较少,故在此分享一点经验,供大家参考. 问题 JQuery easyUi datagri ...
- Handlebars学习第一天
1.什么是handlebars???是用来做什么的??? 首先我们要了解几种前端页面展示的几种模式: a.Struct+vo+el表达式的模式 这种模式的特点:代码看起来比较整齐,但代码解析完才发送到 ...