Fastcgi白皮书
官网版:http://www.fastcgi.com/drupal/node/6?q=node/22#S4
中文版:http://fuzhong1983.blog.163.com/blog/static/1684705201051002951763/
我读的是官网版,老实说,和中文的理解难度差不多,建议读官网版。
概述:
传统的CGI技术是一个request启动一个进程来处理,处理结束后该进程就退出了。Fastcgi采用的技术则是web server启动一个进程处理多个request。而Fastcgi(协议)就是web server和request处理进程之间的协议。
Fastcgi内容简介:
1.实体定义
Fastcgi协议涉及两种类型实体,Fastcgi Server和Fastcgi Application。
Fastcgi Server角色定义:
Application进程管理:启动,删除,数量控制
消息中专:1)从宿主Web Server获取http request处理后分记录通过connection(socket/pipeline/)发送到Application;2)接收Application发回的消息并转发到Web Sever(另有stderr消息,记录到日志)
协议状态控制:1)向Application发送消息使其Abort对一个request的处理;2)连接控制:管理(建立/删除/保持)与Applicatin之间的连接。
Fastcgi Applicatin角色定义:
request处理:接收Fastcgi Server发送过来的消息,并response。
连接管理:Fastcgi server可以将连接管理托管给Application管理。
Fastcgi Application分三种类型:
1)Responser:专门处理http request。
2)Authorizer:访问控制,校验来自http client的用户名/密码组。校验通过后通知Fastcgi Server,它将在后续的http request中附上Authorizer指定的内容。
3)Fileter:和Responser类似,但是区别比较模块,还没有实际使用过,不知其妙!
2.协议的消息:
typedef struct {
unsigned char version;//协议版本
unsigned char type;//消息类型:1)协议管理类消息;2)业务消息
unsigned char requestIdB1;//每个消息属于编号唯一的request,使得Application可以区分并同时处理多个request,也使得消息可以乱续发送
unsigned char requestIdB0;
unsigned char contentLengthB1;//数据长度
unsigned char contentLengthB0;
unsigned char paddingLength;//padding长度,padding是为了使消息8字节对齐
unsigned char reserved;//此字段使得消息头(此前7字节)8字节对齐
unsigned char contentData[contentLength];//数据,不同消息类型有不同的格式
unsigned char paddingData[paddingLength];//padding
} FCGI_Record;
另:
Fastcgi在实现上通过从定义标准输入输出错误流来兼容传统CGI程序。
STDERR将被WEB Server记录到日志。
总结:
有点:Applicaton可以长期运行,减少启动删除进程带来的资源损耗。协议基于TCP/IP 也使得部署更加方便。
缺点:相对当前流行的web框架(eg struts2)来说,功能简陋,难以直接作为开发框架。