1. 什么是CGI
CGI的全称为“通用网关接口”(Common Gateway Interface),为HTTP服务器与其他机器上的
程序服务通信交流的一种工具,CGI程序须运行在网络服务器上。
传统CGI接口方式的主要缺点是性能较差,因为每次HTTP服务器遇到动态程序时都需要通过
重新启动解析器来执行解析,之后结果才会被返回给HTTP服务器。这在处理高并发访问时几乎是不可用的,因此就诞生了FastCGI。另外,传统的CGI接口方式安全性也很差,故而现在已经很少被使用了。
2. 什么是FastCGI
FastCGI是一个可伸缩地、高速地在HTTP服务器和动态脚本语言键通信的接口(在Linux
下,FastCGI接口及为socket,这个socket可以是文件socket,也可以是IP socket),主要优点
是把动态语言和HTTP服务器分离开来。多数流行的HTTP服务器都支持FastCGI,包括Apache、Nginx和Lighttpd等。
同时,FastCGI也被许多脚本语言所支持,比较流行的脚本语言之一为PHP。FastCGI接口采用的是C/S架构,它可以将HTTP服务器和脚本解析服务器分开,同时还能在脚步解析服务器上启动一个或多个脚本 来解析守护进程。当HTTP服务器遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求,或者将动态脚本服务器的结果返回给客户端,这种很大程度上提高了整个应用系统的性能。
FastCGI的重要特点如下:
□ HTTP服务器和动态脚本语言间通信的接口或者工具
□ 可把动态语言解析和HTTP服务器分离开来!
□ Nginx、Apache、Lighttpd以及多数动态语言都支持FastCGI
□ FastCGI接口采用C/S结构,分为客户端(http服务器)和服务端(动态语言解析服务器)
□ PHP动态语言服务端可以启动多个FastCGI的守护进程(例如:php-fpm)
□ http服务器通过(例如Nginx fastcgi_pass)FastCGI客户端和动态语言FastCGI服务端
通信(例如:php-fpm)。
3. Nginx FastCGI的运行原理
Nginx不支持对外部动态程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过
FastCGI接口来调用。FastCGI接口在Linux下是socket,为了调用CGI程序,还需要一个FastCGI的wrapper(可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定的socket上,如端口或文件socket。当Nginx将CGI请求发给这个socket的时候,通过FastCGI接口,wrapper接收到请求,然后派生出一个新的线程,这个线程调用解释器或外部程序处理脚本来读取返回的数据;接着,wrapper在将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx,最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程。