FastCGI
快速通用网关接口(Fast Common Gateway Interface/FastCGI)是一种让交互程序与Web服务器通信的协议。FastCGI是早期通用网关接口(CGI)的增强版本。
FastCGI致力于减少网页服务器与CGI程序之间交互的开销,从而使服务器可以同时处理更多的网页请求。
历史
[编辑]通用网关接口协议(CGI)是一种对接应用程序和网络服务器的接口协议。CGI使外部程序与Web服务器之间交互成为可能。CGI程序运行在独立的进程中,并对每个Web请求建立一个进程,这种方法非常容易实现,但效率较差,难以扩展。
CGI程序运行在独立的进程中,并对每个Web请求建立一个进程,在结束时销毁。这种“每个请求一个新进程”的模型使得CGI程序非常容易实现,但效率较差,难以扩展。在高负载情况下,进程创建和销毁进程的开销变得很大。此外,由于地址空间无法共享,CGI进程模型限制了资源重用方法,如重用数据库连接、内存缓存等。
为了解决CGI的可伸缩性缺点,Open Market开发了FastCGI,并在20世纪90年代中期首次在他们的网络服务器产品中引入了它。Open Market最初开发FastCGI的部分原因是作为对网景公司开发网络应用程序的专有、进程内API(网景服务器API)的竞争回应。
虽然FastCGI最初是由Open Market开发的,但后来被其他几家网络服务器制造商实施。然而,它的方法与其他加速和简化服务器-子程序通信的方法相竞争。像mod_perl和mod_php这样的Apache HTTP服务器模块几乎是同时出现的,并且很快流行起来。截至2019年,包括CGI在内的所有这些不同方法仍在普遍使用。
实现
[编辑]与为每个请求创建一个新的进程不同,FastCGI使用持续的进程来处理一连串的请求。这些进程由FastCGI服务器管理,而不是web服务器。[1]
当进来一个请求时,web服务器把环境变量和这个页面请求通过一个socket比如FastCGI进程与web服务器(都位于本地)或者一个TCP 请求(FastCGI进程在远端的server farm)传递给FastCGI进程。[1]
服务传入请求时,网络服务器通过Unix域套接字、命名管道或TCP连接向FastCGI进程发送环境变量信息和页面请求。响应通过相同的连接从进程返回到网络服务器,然后网络服务器将该响应传递给最终用户。连接可能在响应结束时关闭,但是web服务器和FastCGI服务进程都将持续,不会被销毁。[2]
每个单独的FastCGI进程在其生命周期内可以处理许多请求,从而避免了每个请求进程创建和终止的开销。并发处理多个请求可以通过几种方式来完成:通过内部多路复用使用一个连接(即一个连接上的多个请求);通过使用多个连接;或者通过这些方法的混合。可以配置多个FastCGI服务器,提高稳定性和可扩展性。
优点
[编辑]网站管理员和程序员可以发现,在FastCGI中将网络应用程序与网络服务器分离比嵌入式解释器(mod_perl、mod_php等)有许多优点。这种分离允许服务器和应用程序进程独立重启——这是繁忙网站的一个重要考虑因素。它还能够实现每个应用程序的托管服务安全策略,这是对ISPs和网络托管公司的一个重要要求。[3]不同类型的传入请求可以分发到特定的FastCGI服务器,这些服务器已被配置为高效地处理这些类型的请求。
实现FastCGI的网页服务器
[编辑]- Apache HTTP Server (部分)
- Caddy[9]
- Cherokee HTTP Server
- Hiawatha Webserver
- Lighttpd[10]
- Nginx[11]
- LiteSpeed Web Server
- Microsoft IIS
- Jetty[12]
- Kerio WebSTAR
- OpenBSD 的
httpd(8)
[13] - Open Market 网络服务器
参见
[编辑]参考资料
[编辑]- ^ 1.0 1.1 FastCGI Specification. Open Market, Inc. 1996 [2020-03-24]. (原始内容存档于2016-01-19).
|url-status=
和|dead-url=
只需其一 (帮助) - ^ FastCGI:A High-Performance Web Server Interface. Open Market, Inc. 1996 [2020-03-24]. (原始内容存档于2010-10-01).
|url-status=
和|dead-url=
只需其一 (帮助) - ^ Heinlein, Paul. FastCGI: Persistent Applications for Your Web Server. Linux Journal. 1 November 1998 [4 October 2010]. (原始内容存档于2020-03-24).
- ^ FastCGI apache module mod_fcgid. [2020-03-24]. (原始内容存档于2020-03-28).
- ^ Debian bug #450748: Please add support for TCP/IP FastCGI servers. [2020-03-24]. (原始内容存档于2020-05-28).
- ^ Issues with Apache 2.4 and PHP-FPM. [2012-03-27]. (原始内容存档于2012-03-27).
- ^ libapache-mod-fastcgi on Github. [2020-03-24]. (原始内容存档于2020-05-28).
- ^ FastCGI – The Forgotten Treasure/ Section 2.3.. [2006-02-21]. (原始内容存档于2010-02-08).
- ^ Caddy User Guide – FastCGI. [2020-03-24]. (原始内容存档于2019-07-01).
- ^ FastCGI for Lighttpd. [2020-03-24]. (原始内容存档于2008-12-05).
- ^ FastCGI Extension for IIS6.0 – RTM. FastCGI for IIS. Microsoft. 2008-02-28 [2008-02-29]. (原始内容存档于2007-11-14).
- ^ FastCGI Support in Jetty. [2020-03-24]. (原始内容存档于2020-03-24).
- ^ OpenBSD's httpd(8) initial commit. [2020-03-24]. (原始内容存档于2020-05-28).