FastCGI原理

2016年02月24日

1 CGI原理

通用网关接口(Common Gateway Interface/CGI)描述了客户端和服务器程序之间传输数据的一种标准,实现了浏览器请求服务器执行服务器上的程序,并返回数据。 因为CGI是一种标准,所以独立于程序语言,只要程序能在服务器上运行即可。

1.1 CGI运行机制


CGI的处理流程如下图所示:

cgi_principle

说明:

  1. 服务器收到客户端的请求HTTP Request, 启动CGI进程, 并通过环境变量标准输入将数据传给CGI程序。
  2. CGI进程启动解析器、加载配置文件(如业务相关配置)、连接其他服务器(如数据库服务器)、逻辑处理等。
  3. CGI进程通过标准输出标准错误将数据返回给服务器。
  4. 服务器收到CGI进程返回的结果,构建HTTP Response将数据返回给客户端,结束CGI进程

1.2 小结


通过上面流程图可以看出:在CGI中每一个客户端的动态请求,都要建立一个CGI进程, 这意味这每次请求都要启动程序解析器(脚本语言),加载配置文件等操作, 其中进程的大量创建、消亡使得性能大大降低,而且地址空间无法共享,也限制了资源的重用。此时,FastCGI应运而生。

2 FastCGI


快速通用网关接口(Fast Common Gateway Interface/FastCGI)是一种让交互程序与Web服务器通信的协议。 FastCGI是早期通用网关接口(CGI)的增強版本。 FastCGI致力于减少网页服务器与CGI程序之间通信的开销, 从而使服务器可以同时处理更多的Web请求。

2.1 FastCGI原理


FastCGI的处理流程如下图所示:

fastcgi_principle

流程说明:

  1. Web服务器启动时启动并初始化FastCGI进程。 例如IIS ISAPI、apache mod_fastcgi、 nginx ngx_http_fastcgi、 lighttpd mod_fastcgi。
  2. FastCGI进程管理器自身初始化,启动多个CGI解释器进程并等待来自Web 服务器的连接。(启动FastCGI进程时,可以配置以ip和UNIX域socket两种方式启动)
  3. 当客户端请求Web服务器时, Web服务器将请求采用socket方式发送到FastCGI主进程。FastCGI主进程选择并连接到一个CGI解释器。Web 服务器将CGI环境变量和标准输入发送到FastCGI子进程
  4. FastCGI子进程完成处理后将标准输出和错误信息从同一socket连接返回Web 服务器。当FastCGI子进程关闭连接时,请求便处理完成。
  5. Web服务器利用FastCGI主进程返回的结果构建HTTP Response响应客户端。

2.2 小结


FastCGI程序并不需要不断的创建、消亡新进程,从而大大提高了效率,从FastCGI官网给出的数据,其效率至少比CGI高出5倍。同时 它还支持分布式部署,可以将FastCGI程序放在Web服务器以外的专门的应用服务器上。

3 总结

FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。它还支持分布式的运算, 即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。 FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail- Over特性等等。