1 CGI简介
- CGI,通用网关接口(Common Gateway Interface)是一个Web服务器主机提供信息服务的标准接口。通过CGI接口,Web服务器就能够获取客户端提交的信息,转交给服务器端的CGI程序进行处理,最后返回结果给客户端。
- 归根结底 CGI就是一个接口协议。协议就是大家公认的一套标准(叫CGI标准也可以),比如网络协议。大家都遵守一套标准,就减少了沟通的难度。
- 进行CGI开发,就是编写一个CGI可执行程序。其实各种语言都可以编写CGI,不但Java、Python、PHP、C#等可以,Shell、C和C++也可以。由于早期CGI很多是由Perl(脚本语言)开发的,所以CGI程序也称CGI脚本,其实这个称呼不一定准确。因为C++编译出的可执行文件同样可以是CGI。
2 CGI架构图
3 CGI环境变量
对于CGI程序来说,它继承了系统的环境变量。CGI环境变量在CGI程序启动时初始化,结束时销毁。当一个CGI程序不是被HTTP服务器调用时,它的环境变量几乎是系统环境变量的复制。当这个CGI程序被HTTP服务器调用时,它的环境变量就会多了以下关于HTTP服务器、客户端、CGI传输过程等项目。
3.1 与请求相关的环境变量
环境变量 | 描述 |
---|---|
REQUEST_METHOD | 服务器与CGI程序之间的信息传输方式 |
QUERY_STRING | 采用GET时所传输的信息 |
CONTENT_LENGTH | STDIO中的有效信息长度 |
CONTENT_TYPE | 指示所传来的信息的MIME类型 |
CONTENT_FILE | 使用Windows HTTPd/WinCGI标准时,用来传送数据的文件名 |
PATH_INFO | 路径信息 |
PATH_TRANSLATED | CGI程序的完整路径名 |
SCRIPT_NAME | 所调用的CGI程序的名字 |
3.2 与服务器相关的环境变量
环境变量 | 描述 |
---|---|
GATEWAY_INTERFACE | 服务器所实现的CGI版本 |
SERVER_NAME | 服务器的IP或名字 |
SERVER_PORT | 主机的端口号 |
SERVER_SOFTWARE | 调用CGI程序的HTTP服务器的名称和版本号 |
3.3 与客户端相关的环境变量
环境变量 | 描述 |
---|---|
REMOTE_ADDR | 客户机的主机名 |
REMOTE_HOST | 客户机的IP地址 |
ACCEPT | 列出能被此请求接收的应答方式 |
ACCEPT_ENCODING | 列出客户机支持的编码方式 |
ACCEPT_LANGUAGE | 表明客户机可接受语言的ISO代码 |
AUTHORIZATION | 表明被证实了的用户 |
FORM | 列出客户机的email地址 |
IF_MODIFIED_SINCE | 当用GET方式请求并且只有当文档比指定日期更早时才返回数据 |
USER_AGENT | 客户端浏览器的信息 |
4 Web服务器与CGI程序交互
4.1 CGI结构示意图
浏览器通过HTTP协议发送请求给Web服务器后,Web服务器执行CGI程序,CGI程序可以通过标准输入(STDIN)或者环境变量从服务器端获取数据,执行完毕后,通过标准输出(STDOUT)将结果返回给服务器端,最后Web服务器通过HTTP协议将结果返回给浏览器。
4.2 CGI处理流程
CGI是属于fork-and-execute模式,即每次客户端有新的请求,都会创建一个子进程去执行CGI,执行完毕并将数据返回给服务器后,进程退出。这样,在面对大量请求的时候,进程的大量建立和消亡会使操作系统的性能大幅度下降。此外,由于地址空间无法共享,也限制了资源重用。
5 FastCGI简介
上面也提到,在访问量增大的情况下,CGI有着明显的缺陷,于是就有了FastCGI。FastCGI类似于一个常驻的CGI,它在激活后,不需要每次都花费时间去fork一次,可以一直执行着。感觉上类似于JSP的Servlet。
6 FastCGI扩展的环境变量
环境变量 | 描述 |
---|---|
FCGI_ROLE | 当前FastCGI程序担当的角色,如RESPONDER, AUTHORIZER, FILTER |
FCGI_DATA_LENGTH | 服务器发送的数据长度,仅当FCGI_ROLE为FILTER时有效 |
FILE_LAST_MOD | 输入文件的最后修改时间,其值为自1970年1月1日零时零分零秒至今的秒数,仅当FCGI_ROLE为FILTER时有效 |
7 FastCGI处理流程
FastCGI在启动的时候可以启动多个CGI解析器,在收到请求之后,找到空闲的CGI解析器进行逻辑处理,并输出结果,随后再次进入空闲状态。由于 FastCGI 程序并不需要不断的产生新进程,可以大大降低服务器的压力并且产生较高的应用效率。它的速度效率最少要比CGI 技术提高 5 倍以上。它还支持分布式的部署, 即 FastCGI 程序可以在Web 服务器以外的主机上执行。