CGI和FastCGI

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架构图

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结构示意图

CGI结构示意图

浏览器通过HTTP协议发送请求给Web服务器后,Web服务器执行CGI程序,CGI程序可以通过标准输入(STDIN)或者环境变量从服务器端获取数据,执行完毕后,通过标准输出(STDOUT)将结果返回给服务器端,最后Web服务器通过HTTP协议将结果返回给浏览器。

4.2 CGI处理流程

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处理流程

FastCGI在启动的时候可以启动多个CGI解析器,在收到请求之后,找到空闲的CGI解析器进行逻辑处理,并输出结果,随后再次进入空闲状态。由于 FastCGI 程序并不需要不断的产生新进程,可以大大降低服务器的压力并且产生较高的应用效率。它的速度效率最少要比CGI 技术提高 5 倍以上。它还支持分布式的部署, 即 FastCGI 程序可以在Web 服务器以外的主机上执行。

猜你喜欢

转载自blog.csdn.net/feng964497595/article/details/80558280