12/25
2015

##cgi、fastcgi 最近要搭建node服务器,一开始不能搞清楚node服务器的定位,在这里研究一下服务器与业务应用程序之间的架构以及通信机制。

###cgi CGI:Common Gateway Interface,通用网关接口,Web服务器可以用它来装载程序以响应对特定URL的HTTP请求,并收集程序的输出数据,将其放在HTTP响应中回送。CGI是web服务器与服务器上的应用程序之间的通信协议。

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

web服务器在接收一个请求的时候,会为每一个cgi请求创建一个进程,请求结束之后,销毁进程。这种开销是很大的。因此产生了fastcgi。

###fastcgi FastCGI:Fast Common Gateway Interface,快速通用网关接口。FastCGI致力于减少Web服务器与CGI程式之间互动的开销,从而使服务器可以同时处理更多的Web请求。与为每个请求创建一个新的进程不同,FastCGI使用持续的进程来处理一连串的请求。这些进程由FastCGI进程管理器管理,而不是web服务器

  1. 这种情况下,服务器启动是要有两步:启动FastCGI进程管理器启动web服务器
  2. FastCGI进程管理器自身初始化,启动多个CGI解释器进程并等待来自Web服务器的连接。
  3. 当客户端请求到达Web服务器时,Web服务器将请求以socket的方式转发到FastCGI住进程,FastCGI主进程选择病连接到一个CGI解释器。Web服务器将CGI环境变量和标准输入发送到FastCGI进程。
  4. FastCGI子进程完成处理后将标准输出和错误信息从同一个socket连接返回Web服务器。当FastCGI子进程关闭连接时,请求变处理完成。
  5. FastCGI子进程接着等待并处理来自Web服务器的先一个连接。

###ngix与fastcgi

在nginx中配置:

location /home/ {
	root /home/users/zhanglei55/odp3/webroot;
	index index.php;
    fastcgi_pass $php_upstream;
	include fastcgi.conf;
	rewrite	 ^/home(/[^\?]*)?((\?.*)?)$ /home/index.php$1$2 break;
}
  1. 指定fastcgi和fastcgi的配置。
  2. FastCgi进程管理器,通用的有spawn-cgi,以及更稳定的php-FPM等。

###参考文档

  1. Nginx + CGI/FastCGI + C/Cpp
  2. 搞不清FastCgi与PHP-fpm之间是个什么样的关系
作者:teazean 文章地址: