FastCGI 协议分析
FastCGI(快速通用网关接口)是一种让交互程序与Web服务器通信的协议,可以算是CGI的增强版本。FastCGI减少了网页服务器与CGI程序之间的开销,使得服务器可以同时处理更多的网页请求。目前很多常见的网页服务器都已经支持了该种协议。
通信格式
Web服务器与FastCGI程序之间通过流式套接字来通信,既包含Unix域套接字(Unix Domain
Socket),也可以使用最常见的TCP/IP协议族套接字。FastCGI程序提供的内容与普通的CGI程序相似。由于与CGI程序具有环境变量、标准输入和标准输出等众多获取信息的渠道不同,FastCGI程序仅仅通过Socket获取信息。
消息头
FastCGI规定,任意一个FastCGI数据包必须以一个8字节的消息头开始:
struct FCGI_Header {
unsigned char version;
unsigned char type;
unsigned char requestIdB1;
unsigned char requestIdB0;
unsigned char contentLengthB1;
unsigned char contentLengthB0;
unsigned char paddingLength;
unsigned char reserved;
};
在此消息头中,第一个字节(version
)表示FastCGI协议的版本,目前一般定义为1
。第二个字节(type
)表示数据包的类型,这些类型有:
enum FCGI_Type {
FCGI_BEGIN_REQUEST = 1, // (WEB->FastCGI) 表示一次请求的开始
FCGI_ABORT_REQUEST = 2, // (WEB->FastCGI) 表示终止一次请求
FCGI_END_REQUEST = 3, // (FastCGI->WEB) 请求已被处理完毕
FCGI_PARAMS = 4, // (WEB->FastCGI) 表示一个向CGI程序传递的环境变量
FCGI_STDIN = 5, // (WEB->FastCGI) 表示向CGI程序传递的标准输入
FCGI_STDOUT = 6, // (FastCGI->WEB) 表示CGI程序的标准输出
FCGI_STDERR = 7, // (FastCGI->WEB) 表示CGI程序的标准错误输出
FCGI_DATA = 8, // (WEB->FastCGI) 向CGI程序传递的额外数据
FCGI_GET_VALUES = 9, // (WEB->FastCGI) 向FastCGI程序询问一些环境变量
FCGI_GET_VALUES_RESULT = 10, <