基于机架的 Web 服务器是否代表 FastCGI 协议?

2024-01-19

我读到 CGI/FastCGI 是一种用于将外部应用程序连接到 Web 服务器的协议。 因此,Web 服务器(如 Apache 或 NginX)通过套接字将环境信息和页面请求本身发送到 FastCGI 进程,并且 FastCGI 通过同一连接将响应返回到 Web 服务器,然后 Web 服务器将该响应传递给最终用户。

现在我对它和 Rack 感到困惑,几乎所有 Ruby Web 框架和库都使用 Rack。它提供了一个通过包装 HTTP 请求和响应在 Ruby 中开发 Web 应用程序的接口。

那么,像 Unicorn、Thin、Passenger 或 Puma 这样基于机架的 Web 服务器是否代表相同的 FastCGI 方法?我可以说 Unicorn 是 FastCGI 的 Ruby 实现吗?


正如你所说:

  • FastCGI是一个协议
  • 机架是一个API

所以这实际上是两个完全不同的事情,尽管它们可以 一起使用。

FastCGI 指定两个不同的进程如何相互通信

FastCGI 作为一种协议,指定 https://htmlpreview.github.io/?https://github.com/FastCGI-Archives/fcgi2/blob/master/doc/fcgi-spec.html两个不同的进程(通常是 Web 服务器和应用程序服务器或“FastCGI 服务器”)如何通过网络连接相互通信。规范定义records https://htmlpreview.github.io/?https://github.com/FastCGI-Archives/fcgi2/blob/master/doc/fcgi-spec.html#S3.3由两个进程发送和接收的特定格式的数据。

发送和接收这些消息的程序到底是什么样子并没有指定,并且可以是任何东西。一方面,您可能有一个 C 程序,在内存中组装数据,然后进行系统调用,让操作系统发送数据;另一方面,您可能有一个 Ruby 程序,打开一个套接字,将数据读入数组,然后然后解析这些数据,并构建一个封装请求的新对象。

Rack 指定哪些 Ruby 对象和方法必须可供更高级别的软件使用

另一方面,Rack 作为Ruby API 规范 http://www.rubydoc.info/github/rack/rack/master/file/SPEC从应用程序的角度,精​​确指定了实现某种 Web 应用程序的高级软件必须可以使用哪些 Ruby 对象和方法,以及这些对象和方法必须如何运行。 (不要对上面链接的文档中使用的“协议”一词感到困惑。这里它不是指通过通信链路发送的数据格式,而是指面向对象编程的概念“消息”在对象之间交换以表达程序行为,尽管这实际上是在不同级别和时间实现为函数调用。)

作为一个 API 规范,Rack API 的用户在调用 Rack 实现所提供的各种对象上的方法时,至少应该表现得好像不知道幕后发生了什么。 (通常它不知道。)可能的情况是,库实际上已经通过 FastCGI 或某些其他协议与充当 Web 服务器的单独进程建立了通信,并从其他进程读取消息并将消息发回根据使用 API 实现的应用程序执行的操作。但另一方面,您同样可以(至少在理论上)引入完全不同的 API 实现,该 API 本身具有 Ruby 代码来运行 Web 服务器,并且为 Web 应用程序运行 Ruby 代码的进程将是运行额外的 Ruby 代码来直接与客户端 Web 浏览器或其他设备对话 HTTP 协议。

你不能说 Unicorn(或 Rack API 的任何其他实现)是“FastCGI 的 Ruby 实现”

这个问题并不像您提出的那样适用,因为 Rack API 规范的全部要点是您明确避免考虑通过该 API 提供的服务的实际实现。很可能某些实现正在使用 FastCGI,但您的应用程序应该与未使用 FastCGI 的应用程序同样工作,并且您真的不想关心幕后发生的事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于机架的 Web 服务器是否代表 FastCGI 协议? 的相关文章

随机推荐