本文主要介绍FastCGI的相关知识。有关CGI(Common Gateway Interface)的知识,点击此处查看。
1 概述
FastCGI实际上是增加了一些扩展功能的CGI,是CGI的改进,描述了客户端和Web服务器程序之间传输数据的一种标准。
FastCGI致力于减少Web服务器与CGI程序之间进行互动的开销,从而使Web服务器可以同时处理更多的Web请求。与CGI为每个Web请求创建一个新的进程不同,FastCGI使用持续的进程来处理一连串的Web请求,这些进程由FastCGI进程管理器管理,而不是Web服务器。
2 FastCGI与CGI
2.1 相同点
FastCGI与CGI之间的相同点如下:
- 与CGI一样,FastCGI也是语言无关的;
- 与CGI一样,FastCGI在独立于Web服务器的(FastCGI)进程中运行应用程序,这种方式相对于API来说,具有更高的安全性。API将程序代码接口连接到Web服务器中,这可能导致:当某一个基于API的程序出现bug时,就会影响到其他应用程序或Web服务器。例如,一个恶意的基于API的程序可以从其他的应用程序或Web服务器中窃取关键的安全秘密;
- 与CGI一样,FastCGI与任何Web服务器的内部架构都不存在绑定关系。因此,当Web服务器技术改变时,FastCGI依旧很稳定。如果某个API与Web服务器的内部架构有关联,那么当Web服务器的架构发生变化时,这个API也要做出相应的改变
2.2 不同点
FastCGI不仅继承了CGI的优点,而且还新增了若干新功能。如下:
- 分布式计算:我们可以Web服务器以外的机器上运行FastCGI应用程序。分布式计算是一项经过验证的技术,该技术应用于:调整、连接已存在的合作系统,充分利用系统性能,提升系统安全性(如firewalls);
- 多角色与可扩展角色:CGI应用程序处理HTTP请求并给出返回值, FastCGI的功能不止于此。例如,执行模块化的认证和身份检查、转换数据格式。FastCGI的这些特性使其将来可充当更多的角色。
3 架构图
FastCGI的架构图如下:
FastCGI的工作流程如下:
【准备阶段】:
1. Web服务器启动时,初始化FastCGI的程序执行环境。例如Nginx服务器对应的ngx_http_fastcgi_module模块。
2. FastCGI进程管理器自身初始化,启动多个CGI解释器进程并等待来自Web服务器的连接。例如,使用spawn-fcgi。FastCGI进程管理器启动demo:
spawn-fcgi -a 127.0.0.1 -p 8080 -f /opt/nginx-1.7.7/cgi-bin/demo
说明:启动FastCGI进程时,可以配置以IP或UNIX域socket两种方式启动。
【循环阶段】:
3. 当客户端请求到达Web服务器时,Web服务器将该请求采用socket方式转发到FastCGI主进程,FastCGI主进程选择并连接到一个CGI解释器(关联FastCGI子进程),然后,Web服务器将CGI环境变量和标准输入发送到FastCGI子进程。
4. FastCGI子进程完成处理后,将标准输出和错误信息从同一socket连接返回给Web服务器。最后,FastCGI子进程关闭与Web服务器之间的连接。
5. FastCGI子进程继续等待并处理下一个来自Web服务器的连接。
4 总结
由于FastCGI程序并不需要不断产生新进程,因此使用FastCGI可以大大降低Web服务器的压力并产生较高的应用效率。
CGI就是所谓的短生存期应用程序,而FastCGI就是所谓的长生存期应用程序。FastCGI像是一个常驻(long-live)型的CGI。FastCGI可以一直执行着,而不会每次花费时间去fork(这也是CGI最为人诟病的fork-and-execute模式)。