[Wade Himo: Understanding FastCGI Settings for IIS 5.1 & 6]
For more information see link:
什么是CGI?Comon Gateway Interface!为应用程序开发人员提供了与Web Server交互的能力。每一个版本的IIS都对CGI有着很好的支持。CGI规范的内容,简单来说,就是Server接收到了request,然后它创建一个新的Process去处理这个请求;对于新的Process,stdin被重定向并且用来接收来自Client的request;stdout也被重定向并且用来向client写回数据。此外,command line和环境变量被用来提供CGI进程的信息。
CGI之上的问题:为了处理每一个CGI的请求,都会导致一个新的Process,spinning up,doing work,shutting down。对于一个light weight process creation的os来说,性能会受限于doing work这个部分;对于一个os是expensive operation来说的话,doing work这个部分会让这个系统崩溃掉。所以,“This is the reason that CGI flourishes on our main competition running on a Unix-based platform, but is not recommended on IIS.”
什么是ISAPI?Internet Server Application Programming Interface!运行于Web Server Process的内部。当新的request到达时,不会去创建新的进程。取而代之的是,Web Server会加载.dll到自己的process,并调用他的入口函数。“Instead, the web server calls an entry point in a dll that is loaded into the web server process. ”。ISAPI可以启用线程模型来提高性能。
什么是FastCGI?为什么我们需要它?“Basically, we need FastCGI due to the existence of popular CGI-based development platforms”。PHP很早之前就已经被IIS所支持了,通过CGI和ISAPI来实现。但是这两种实现都只是一种折中!CGI的实现会受到进程创建特性的限制;而ISAPI由于运行在多线程的进程中,PHP实现本身是线程安全的,但是很多对他的扩展并不是这样子的,这对服务器的稳定会造成隐患。
FastCGI提供了对性能和稳定保障的解决方案。为此,FastCGI保留几乎所有的原始CGI(包括非多线程的环境),但是它允许CGI的宿主进程,在request处理完成之后保留该进程,并使之被重用。
So what does my ISAPI background have to do with FastCGI?在IIS 7中的PHP handler和后台的ISAPI并没有联系。这是应为IIS 7提供了许多全新的强大的API,用来host各种不同俄平台。对于早期版本的IIS没有这样丰富的API,所以FastCGI是运行在ISAPI之上的。
FastCGI可以被分成以下几个部分: Applications, the Application Manager, and various code to support the FastCGI protocol。为了能够同时处理多个request,FastCGI handler使用到了进程池(process pool/application)。有许多进程池的属性将需要被进行适当的配置,如:进程池中进程的个数,一个进程中可以被接收的request的数量。FastCGI handler也支持多进程池!因为可能同时会有多个种类的FastCGI运行在服务器上面(PHP和Ruby),也可能一个服务器上会有多个站点。Multiple process pools由application manager来进行管理。
最后,需要将FastCGI handler加载进IIS,这样才能让到达的request被路由到其之上。IIS 7和之前的版本有着很大的不同。在IIS 5.1和6.0之中,我们使用“script maps”将特定的文件扩展名映射到处理它的ISAPI上。除此之外,我们可以指定,只有当对应于请求的文件存在的时候,该请求才会被处理。这是出于安全考虑的一种设置方案,但是在很多情况下,我们希望我们的url并没有其下对应的物理文件。
包含FastCGI handler的ISAPI extension是fcgiext.dll。如果要FastCGI handler处理php,就要把.php映射到.fcgiext.dll上;如果要处理Ruby,就映射.rb。我们也可以使用“wildcard script map”来让所有的request都由fcgiext.dll来处理。