- 浏览: 2036733 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (651)
- ACE (35)
- BAT (9)
- C/C++ (116)
- fast-cgi (14)
- COM (27)
- python (59)
- CGI (4)
- C# (2)
- VC (84)
- DataBase (29)
- Linux (96)
- P2P (6)
- PHP (15)
- Web (6)
- Memcached (7)
- IME输入法 (11)
- 设计模式 (2)
- 搜索引擎 (1)
- 个人情感 (4)
- 笔试/面试 (3)
- 一亩三分地 (33)
- 历史 (2)
- 地理 (1)
- 人物 (3)
- 经济 (0)
- 不仅仅是笑哦 (43)
- 小故事大道理 (2)
- http://www.bjdsmyysjk120.com/ (0)
- http://www.bjdsmyy120.com/ (0)
- 它山之石可以攻玉 (15)
- 大学生你关注些什么 (28)
- 数据恢复 (1)
最新评论
-
luokaichuang:
这个规范里还是没有让我明白当浏览器上传文件时,STDIN的消息 ...
FastCGI规范 -
effort_fan:
好文章!学习了,谢谢分享!
com技术简介 -
vcell:
有错误os.walk(strPath)返回的已经是全部的文件和 ...
通过python获取目录的大小 -
feifeigd:
feifeigd 写道注意:文章中的CPP示例第二行 #inc ...
ATL入门:利用ATL编写简单的COM组件 -
feifeigd:
注意:文章中的CPP示例第二行 #include " ...
ATL入门:利用ATL编写简单的COM组件
FastCGI学习总结
作者: Jimmy Cao,2008/9 All Rights Reserved 共同学习进步,转载请注明
什么是FastCGI
FastCGI :Fast Common Gateway Interface(快速通用网关接口),它是CGI的增强版。FastCGI是一个快速、开放和安全的web server接口,解决了传统CGI的性能问题,却又没有带来编程的复杂性。老的CGI程序可以很轻易的移植成FastCGI程序。
FastCGI的技术原理
如果想了解FastCGI的技术原理就要了解何为"短生存期应用程序",何为"长生存期应用程序"。
先从CGI技术开刀,以下是CGI技术的理论:每次当客户请求一个CGI的时候,Web服务器就请求操作系统生成一个新的CGI进程。当CGI满足要求后,服务器就杀死这个进程。服务器对客户端的每个请求都要重复这样的过程。
而FastCGI技术的理论为:FastCGI程序一旦产生后,他可以持续工作,足够满足客户的请求直到被明确的终止。如果你希望通过协同处理来提高程序的性能,你可以请求Web服务器运行多个FastCGI 应用程序的副本。 CGI就是所谓的短生存期应用程序,FastCGI就是所谓的长生存期应用程序。
由于FastCGI程序并不需要不断的产生新进程,可以大大降低服务器的压力。并且产生较高的应用效率。
FastCGI的特点
1. 打破传统页面处理技术
传统的页面处理技术,程序必须与Web服务器或Application服务器处于同一台服务器中。这种历史已经早N年被FastCGI技术所打破,FastCGI技术的应用程序可以被安装在服务器群中的任何一台服务器,而通过TCP/IP协议与Web服务器通讯,这样做既适合开发大型分布式Web群,也适合高效数据库控制。
2. 明确的请求模式
CGI技术没有一个明确的角色,在FastCGI程序中,程序被赋予明确的角色(响应器角色(Responder)、认证器角色(Authorizer)、过滤器角色(Filter))。
3. 独立性
架构独立性:FastCGI接口并不绑定特定的应用服务器架构,应用既可以是单线程的也可是多线程的。
进程独立性:FastCGI进程是独立于服务器的进程,对FastCGI进程的调试不影响服务器。同理,FastCGI进程的崩溃也不至于服务器崩溃。
语言独立性:FastCGI技术目前支持语言有:C/C++、Java、Perl、Tcl、Python、SmallTalk、Ruby等。
如何开发FastCGI程序
实现细节
先来看看传统CGI是怎么做的,如下图:
图一:CGI的数据流
CGI应用是通过标准的POSIX流(stdin, stdout, stderr和环境变量)加上环境变量,来与HTTP服务器进行通信。
与CGI类似,FastCGI采用的方法是:在HTTP进程和FastCGI进程之间创建一个全双工的连接,数据报通过FastCGI协议封装在两个进程之间传递。
stdin和环境变量被封装在连接的输入部分;stdout和stderr被封装在连接的输出部分。
因此,作为输入端,FastCGI程序从连接上接收数据,解包,分离出stdin和环境变量,然后调用应用处理逻辑。作为输出端,FastCGI用FastCGI协议打包stdout和stderr,发送给HTTP服务器处理。
由于FastCGI应用不要求和HTTP服务器运行在同一个节点上,因此,FastCGI支持两种形式的连接:1)流管道,用于在同一个节点上的通信;2)TCP流,用于不同节点上的通信。
下图是FastCGI应用和HTTP服务器不在同一个机器上的数据流图:图二:FastCGI和HTTP不在同一节点的数据流
程序框架
不同于CGI程序的单次执行特性,FastCGI的主程序框架有一个循环,如下:
Initialize application;
while(FCGI_Accept()
>= 0) {
Process request;
}
初始化部分,只执行一次,所以常常把一些耗时的工作放在此处理,如:打开和连接数据库,计算表和位图值等。
另外初始化部分,还完成环境变量初始化等工作。
然后,程序阻塞在FCGI_Accep()调用上,一旦有连接上了就处理,否则就阻塞。
一个简单的FastCGI程序实例:
#include "fcgi_stdio.h" /* fcgi library; put it first*/
#include <stdlib.h>
int count;
void initialize(void)
{
count=0;
}
void main(void)
{
/* Initialization. */
initialize();
/* Response loop. */
while (FCGI_Accept() >= 0) {
printf("Content-type: text/html\r\n"
"\r\n"
"<title>FastCGI Hello! (C, fcgi_stdio library)</title>"
"<h1>FastCGI Hello! (C, fcgi_stdio library)</h1>"
"Request number %d running on host <i>%s</i>\n",
++count, getenv("SERVER_HOSTNAME"));
}
}
另外一个例子,是从stdin和环境变量获取表单参数的例子,由于代码过长,以附件形式给出:
<!--[if gte vml 1]><v:shape id="_x0000_i1027" type="#_x0000_t75" style='width:73.5pt;height:36.75pt' o:ole=""> <v:imagedata src="file:///C:\DOCUME~1\andylin\LOCALS~1\Temp\msohtml1\01\clip_image003.wmz" o:title="" /> </v:shape><![endif]--><!--[if gte mso 9]><xml> <o:OLEObject Type="Embed" ProgID="Package" ShapeID="_x0000_i1027" DrawAspect="Content" ObjectID="_1332338208"> </o:OLEObject> </xml><![endif]--><!--[if gte vml 1]><v:shape id="_x0000_i1028" type="#_x0000_t75" style='width:57pt;height:36.75pt' o:ole=""> <v:imagedata src="file:///C:\DOCUME~1\andylin\LOCALS~1\Temp\msohtml1\01\clip_image005.wmz" o:title="" /> </v:shape><![endif]--><!--[if gte mso 9]><xml> <o:OLEObject Type="Embed" ProgID="Package" ShapeID="_x0000_i1028" DrawAspect="Content" ObjectID="_1332338209"> </o:OLEObject> </xml><![endif]-->
附录:CGI常用环境变量
环境变量 |
说明 |
ALL_HTTP |
未包括在本表格中给出的变量内的所有HTTP标题,如:这个变量来自表格HTTP_<标题栏名称> |
QUERY_STRING |
传递给程式的 query 信息,即:在指向URL中跟在问号(?)后的信息 |
REMOTE_HOST |
使用者发出 request 的远端 host 名称 |
REMOTE_ADDR |
使用者发出 request 的远端 IP 位址 |
AUTH_TYPE |
用来确定使用者合法性的监定方法 |
REMOTE_USER |
使用者的合法名称 |
REMOTE_IDENT |
发出 request 的使用者 |
CONTENT_TYPE |
query 信息中的 MIME 类型 |
CONTENT_LENGTH |
以字节为单位的从客户端接收来的脚步长度 |
HTTP_FORM |
使用者发出 request 的电子邮件讯息 |
HTTP_ACCEPT |
client 可以接受的 MIME 类型列表 |
HTTP_COOKIE |
与你站点打交道的客户的任何cookie(存储片)集合 |
HTTP_USER_AGENT |
client 用来发出 request 的浏览器 |
GATEWAY_INTERFACE |
Server 使用的 CGI 版本 |
SERVER_NAME |
Server 的 host 名称或 IP 位址 |
SERVER_SOFTWARE |
回应 client request 的 Server 软体名称和版本 |
SERVER_PROTOCOL |
传递资讯所用的协定名称或版本 |
SERVER_PORT |
Server 正在执行的 port number |
SERVER_PORT_SECURE |
值为0或1,值1表示请求出现在加密端口 |
URL |
请求的URL地址 |
REQUEST_METHOD |
发出 request 的方法 |
PATH_INFO |
传递给 CGI 程式的额外路径 |
PATH_TRANSLATED |
存在 PATH_INFO 中的给定路径的传递版本 |
SCRIPT_NAME |
程式执行时的 virtual path |
DOCUMENT_ROOT |
网路提供的文件服务所在路径 |
HTTP_REFERER |
在读取 CGI 程式前,client 所指的文件 URL |
发表评论
-
多机器执行ssh脚本
2012-08-30 18:12 2242#!/bin/bash Usage() { ... -
Berkeley DB 使用经验总结
2012-08-27 14:41 3087作者:陈磊 NoSQL是现在互联网Web2.0时代备受 ... -
嵌入式数据库系统Berkeley DB
2012-08-27 14:37 1534前言 UNIX/LINUX平台下的数据库种类非常多 ... -
shell中双引号的误用
2011-05-12 15:02 1186for i in "$LIST" ... -
shell for循环
2011-04-06 15:36 993for i in "1 2 3";do e ... -
shell技巧 除法
2011-03-07 11:34 19189shell计算中使用除法,基本默认上都是整除。 比如: ... -
.bash_profile 文件修改之后不执行
2011-02-16 11:21 1949重新登录 不可能不好用的 除非你是从一个用户su oralc ... -
SecureCRT中文显示乱码的解决方法
2011-02-12 11:38 1352最近开始用SecureCRT登陆linux系统,由于是新手,很 ... -
让putty显示中文
2011-02-11 14:43 1431对于经常在windows下远程ssh到linux的用户而言,p ... -
Linux文件类型全解析
2011-01-04 15:13 1413Linux文件类型全解析 ... -
Linux进程状态解析之T、Z、X
2011-01-04 15:09 1831摘要: Linux系统中进程有很多种 ... -
Linux进程状态解析之R、S、D
2011-01-04 14:54 4893摘要: Linu ... -
shell获取参数
2010-12-31 15:29 4202#!/bin/bash Usage() { ... -
Shell实现cgi接口示例
2010-12-30 14:59 2007ls -l /var/www/cgi-bin/ -rwxrw ... -
shell数组
2010-12-29 16:48 1303shell数组 Bash中还可以使用数 ... -
shell 自动化处理
2010-12-29 15:52 1045#!/bin/bash sudo yum instal ... -
Linux用户添加sudoer
2010-12-29 11:37 25153使用sudo可以在以非root用户登录时临时获得root权限, ... -
lsof:一个功能强大的命令
2010-12-24 16:30 1357lsof:一个功能强大的命令 lsof命令的原始功能 ... -
linux 的库操作命令 ar和nm
2010-12-22 20:31 1411当我们的程序中有经 ... -
LINUX查看硬件配置 命令
2010-12-21 18:55 1078常用命令整理如下: 查看主板的序列号: dmidec ...
相关推荐
### FastCGI学习总结 #### 一、FastCGI 技术原理 FastCGI(Fast Common Gateway Interface),即快速通用网关接口,是CGI(Common Gateway Interface)的一种改进版本。FastCGI的主要目标是解决传统CGI的性能瓶颈...
FastCGI是一种高性能的Web服务器接口,它是CGI(通用网关接口)的增强版本,旨在解决传统CGI性能上的问题。FastCGI程序能够长时间运行,而不是每次用户请求时都创建新的进程,从而提高了效率并降低了服务器负载。...
1. **FastCGI学习总结.doc**:这份文档可能涵盖了FastCGI的基本概念、工作流程、优势和实践案例。 2. **实战FastCGI.doc**:可能详细介绍了如何在不同Web服务器环境下设置和优化FastCGI。 3. **FastCGI中文参考手册....
**FastCGI 中文参考手册概述** ...通过学习手册,开发者可以更好地利用 FastCGI 来优化网站性能,提升用户体验。在实际工作中,结合具体的 Web 服务器和编程语言,可以实现高效、稳定的后端服务。
总结起来,"Go-gofast"是一个强大的Go语言FastCGI客户端库,它提供了高效的连接管理、请求构造、响应解析等功能,让Go开发者可以轻松集成FastCGI服务,提升Web应用的性能和扩展性。对于需要在Go中使用FastCGI的...
Apache FastCGI是一种高效的方法,用于在Apache web服务器上运行动态内容,比如PHP、Perl或Python等脚本语言。...通过学习提供的入门文档,你可以深入了解FastCGI的工作机制,从而更好地利用这个强大的技术。
总结来说,这个压缩包提供了易语言环境下的FASTCGI支持,使开发者能够利用易语言开发与Web服务器通过FASTCGI交互的应用,同时支持静态编译,确保程序的便携性。此外,易语言的脚本和自动化特性使其在按键精灵和其他...
总结,jFastCGI是Java环境下实现FastCGI服务的利器,通过学习和研究其源码,开发者不仅可以掌握FastCGI的工作机制,还能深入了解Java在网络编程中的应用,提升自己的技能。通过实践,可以将Java应用程序轻松地接入到...
**FastCGI与Java技术详解** ...通过学习和研究jFastCGI的源代码,我们可以更深入地理解FastCGI协议,掌握如何在Java环境中实现高性能的Web服务。此外,这种无容器部署模式也有助于优化服务器资源管理和应用部署策略。
总结来说,`kcgi`是一个强大且灵活的C++库,适用于快速构建CGI和FastCGI应用程序。它的简洁设计使得它特别适合那些希望深入了解Web服务器与应用程序之间交互的开发者。通过掌握`kcgi`,开发者可以创建高性能、安全的...
### IIS+FastCGI+PHP5.3+MySQL5.1+Gzip 配置教程解析 #### 前言 本篇图文教程详细介绍了如何配置IIS+...整体来说,这是一篇非常实用且易于跟随的图文教程,对于想要学习如何配置这类环境的人来说是非常宝贵的资源。
Nginx的Web缓存服务主要由proxy_cache相关指令集和fastcgi_cache相关指令集构成,前者用于反向代理时,对后端内容源服务器进行缓存,后者主要用于对FastCGI的动态程序进行缓存。两者的功能基本上一样。 Nginx 0.8.32...
- **SegmentFault与FastCGI**:SegmentFault错误可能导致内存泄漏,FastCGI协议的细节也可能影响CTF挑战。 3. **数据库技巧** - **MySQL**:包括SQL注入、InnoDB表统计、`updatexml`和`extractvalue`函数的使用,...
根据提供的文件内容,我们可以生成一系列与在Mac OS上...这些操作对于开发者来说十分关键,尤其是在学习如何将Web应用上线的过程中。通过本教程的指引,开发者可以在Mac OS上成功部署一个基于Flask和Nginx的Web应用。
在提供的压缩包文件"fastcgi-development-kit-master"中,可能包含了FDK的源代码,你可以通过阅读这些源码来学习如何在Java中实现FastCGI服务器。这通常涉及到解析FastCGI协议的报文,以及与Web服务器进行通信的逻辑...
总结,"计算机软件-编程源码-CGI脚本入门学习.zip"这个资源对于想要学习CGI编程的初学者来说非常宝贵。通过学习和实践,你可以掌握如何编写CGI脚本,理解其工作原理,并进一步探索动态网站开发的世界。
通过分析题目,我们可以学习到如何使用COLLATE utf8mb4_bin来实现时间盲注,以及如何使用nginx的fastcgi缓存文件包含来获取flag。同时,我们还可以学习到如何使用python的requests库来发送请求,并爆破出正确的pid。...
TS版本适用于IIS以ISAPI方式加载的情况,而NTS版本则适合FastCGI方式运行。 #### 3. PHP学习路径与资源 - **学习资源**:鼓励读者利用教科书、参考书籍、手册、搜索引擎(如Google)和知识分享平台等资源来辅助...
...本篇文章将深入探讨如何在Linux系统上快速安装并配置LNMP环境,同时实现MySQL的分离,以提高系统的稳定性和可维护性。...记住,实践是最好的老师,不断尝试和学习,才能更好地驾驭这个强大的Web服务组合。