FastCGI点滴

时间:2022-11-09 16:25:20

FastCGI是一种二进制协议,用于将交互式程序与Web服务器连接。它是早期通用网关接口(CGI)的变体。FastCGI的主要目标是减少与Web服务器和CGI程序之间的接口相关的开销,允许服务器每单位时间处理更多的Web页面请求。

 对比CGI

通用网关接口(CGI)是一种用于将外部应用程序连接到Web服务器的协议。CGI应用程序在单独的进程中运行,这些进程在每个请求开始时创建,并在最后被拆除。这种“每个请求一个新进程”模型使CGI程序实现起来非常简单,但限制了效率和可伸缩性。在高负载下,用于创建和销毁进程的操作系统开销变得非常重要。此外,CGI流程模型限制了资源重用方法,例如重用数据库连接,内存缓存等。

为了解决CGI的可扩展性缺点,Open Market开发了FastCGI,并在20世纪90年代中期首次将其引入其网络服务器产品中。Open Market最初开发的FastCGI部分是为了响应Netscape专有的进程内应用程序编程接口(API)(Netscape Server应用程序编程接口(NSAPI)),用于开发Web应用程序。

虽然首先由Open Market开发,但FastCGI随后由其他几家网络服务器制造商实施。然而,它的方法与其他方法竞争,以加速和简化服务器子程序通信。Apache HTTP Server模块(如mod_perl和mod_php)大约在同一时间出现,并迅速普及。截至2019年,包括CGI在内的所有这些方法仍然普遍使用。

实施细节

FastCGI不是为每个请求创建新进程,而是使用持久进程来处理一系列请求。这些进程归FastCGI服务器所有,而不是Web服务器。

为了服务传入请求,Web服务器通过Unix域套接字,命名管道或传输控制协议(TCP)连接将环境变量信息和页面请求发送到FastCGI进程。响应通过同一连接从进程返回到Web服务器,然后Web服务器将该响应传递给最终用户。可以在响应结束时关闭连接,但Web服务器和FastCGI服务进程都会持续存在。

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

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