FastCGI

快速通用网关接口Fast Common Gateway Interface/FastCGI)是一种让交互程序与Web服务器通信的协议。FastCGI是早期通用网关接口(CGI)的增強版本。

FastCGI致力於減少網頁伺服器與CGI程式之間互動的開銷,從而使伺服器可以同時處理更多的網頁請求。

歷史
通用网关接口协议(CGI)是一种对接应用程序和网络服务器的接口协议。CGI使外部程式與Web伺服器之間交互成為可能。CGI程式運行在獨立的進程中,並對每個Web請求建立一個進程,這種方法非常容易實現,但效率较差,難以擴展。

CGI程式運行在獨立的進程中,並對每個Web請求建立一個進程,在结束时销毁。这种“每个请求一个新进程”的模型使得CGI程序非常容易實現,但效率较差,難以擴展。在高负载情况下,进程创建和销毁进程的开销变得很大。此外,由於地址空間無法共享,CGI进程模型限制了资源重用方法,如重用数据库连接、内存缓存等。

为了解决CGI的可伸缩性缺点,开发了FastCGI,并在20世纪90年代中期首次在他们的网络服务器产品中引入了它。Open Market最初开发FastCGI的部分原因是作为对网景公司开发网络应用程序的专有、进程内API(网景服务器API)的竞争回应。

虽然FastCGI最初是由Open Market开发的,但后来被其他几家网络服务器制造商实施。然而,它的方法与其他加速和简化服务器-子程序通信的方法相竞争。像mod_perl和mod_php这样的Apache HTTP服务器模块几乎是同时出现的,并且很快流行起来。截至2019年,包括CGI在内的所有这些不同方法仍在普遍使用。

實現
与为每个请求创建一个新的进程不同,FastCGI使用持续的进程来处理一连串的请求。这些进程由FastCGI服务器管理,而不是web服务器。

当进来一个请求时,web服务器把环境变量和这个页面请求通过一个socket比如FastCGI进程与web服务器(都位于本地)或者一个TCP 请求(FastCGI进程在远端的server farm)传递给FastCGI进程。

每个单独的FastCGI进程在其生命周期内可以处理许多请求,从而避免了每个请求进程创建和终止的开销。并发处理多个请求可以通过几种方式来完成:通过内部多路复用使用一个连接(即一个连接上的多个请求);通过使用多个连接;或者通过这些方法的混合。可以配置多个FastCGI服务器,提高稳定性和可扩展性。

优点
网站管理员和程序员可以发现,在FastCGI中将网络应用程序与网络服务器分离比嵌入式解释器(mod_perl、mod_php等)有许多优点。这种分离允许服务器和应用程序进程独立重启——这是繁忙网站的一个重要考虑因素。它还能够实现每个应用程序的托管服务安全策略,这是对ISPs和网络托管公司的一个重要要求。不同类型的传入请求可以分发到特定的FastCGI服务器,这些服务器已被配置为高效地处理这些类型的请求。

-{zh:实现;zh-hans:实现;zh-hant:實作;}-FastCGI的網頁伺服器

  • Apache HTTP Server (部分)

** 通過[http://httpd.apache.org/mod_fcgid/ mod_fcgid]模塊實現。這個模塊曾屬於第三方,但是在2009年被授予ASF,成為Apache的一個子項目。它只支持Unix域套接字,不支持TCP套接字。
** 一個較早的第三方模塊 mod_fastcgi 。但是这个模块从Apache 2.4.x 开始就不再被一同编译了。 虽然这个模块相关的bug早就被解决了。
**Apache 1.x 在设计上禁止多路复用单个连接接收请求,因此Aapache 1.x是不支持的。
**在 Aapache 2.4 中,添加了新的[http://httpd.apache.org/docs/2.4/mod/mod_proxy_fcgi.html mod_proxy_fcgi]模块,支持TCP FastCGI服务器。
*Caddy

  • Cherokee HTTP Server

*
** 支持FastCGI的負載平衡
** 支持chrooted FastCGI 伺服器

  • Lighttpd
  • Nginx
  • LiteSpeed Web Server
  • Microsoft IIS

*Jetty
*Kerio WebSTAR
*OpenBSD 的 [http://man.openbsd.org/OpenBSD-current/man8/httpd.8 httpd(8)]
*Open Market 网络服务器

参见

  • CGI
  • IIS
  • nginx

参考资料

评论 (0)

  • 还没有评论,来抢沙发吧。