基于机架的 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 协议? 的相关文章

  • sleep 0 有特殊含义吗?

    我看到很多用法sleep 0在我的一个客户项目中 代码看起来像这样 while true sleep 0 end 阅读一些像这样的答案this https stackoverflow com questions 3727420 signif
  • 如何使 Rails 3 资源预编译速度更快?

    我有一个正在运行的 Rails 3 2 1 应用程序 我正在通过 Capistrano 进行部署deploy assets它运行deploy assets precompile task 一切工作都很好 除了编译本身非常慢 我没有那么多 C
  • Rails 4 - 如何链接到 PDF 文件(名称.PDF)?

    我正在生成 PDF 文件 我的链接如下所示 当我点击这个时 它会带我去 display invoice 123456789 这是一个 HTML 版本 在控制器中的操作如下 def display invoice if params invo
  • 通过推送通知唤醒

    Suppose 有一些对象 例如 一个数组a 和依赖于对象的条件 例如 a empty 当前线程以外的某些线程可以操作该对象 a 因此条件评估值的真实性会随着时间的推移而变化 如何让当前线程在代码中的某个时刻休眠 并在条件满足时通过推送通知
  • 如何计算带有偏移量的异或?

    我想用不同的偏移量进行异或计算以在计算中列出 例子 key 0 1 0 text 0 1 0 1 0 1 0 1 1 1 异或计算 key 0 text 0 key 1 text 1 key 2 text 2 key 0 text 3 ke
  • 如何从 Ruby 程序发送邮件?

    我想从 Ruby 应用程序发送电子邮件 核心语言中是否有调用来执行此操作 或者是否有我应该使用的库 最好的方法是什么 如果你不想使用行动邮递员 http wiki rubyonrails org rails pages ActionMail
  • 如何使用本地安装的gems执行Ruby程序?

    我已经使用安装了我的依赖项 bundle package 然后将它们传输到离线服务器并运行 gt bundle install local Using mime types 1 19 Using rest client 1 6 7 Usin
  • Heroku 部署错误

    在 Windows 环境中 尝试部署到 Heroku 时出现以下错误 C Ruby lib ruby gems 1 8 gems heroku 1 9 13 lib heroku commands base rb 32 in 没有这样的文件
  • 使用 VCR 过滤敏感数据

    我正在使用 VCR gem 记录 http 交互并在将来重播它们 我想过滤掉 uri 请求中的实际密码值 以下是 uri 的示例 http services somesite com Services asmx Cabins Usernam
  • 多重要求和允许强参数rails 4

    在下面的情况下 我尝试使用强参数 我想要求email address password并允许remember me fields 但像下面这样使用它只允许最后一行在方法示例中 在下面的情况下 它只需要params permit rememb
  • 使用 attr_accessor 动态创建类属性

    在Ruby中 有没有办法动态地将实例变量添加到类中 例如 class MyClass def initialize create attribute name end def create attribute name attr acces
  • “rmagick”gem 安装问题

    我在尝试在 centos 上安装 rmagick gem 时遇到问题 以下是我得到的输出 谁能帮我识别一下我缺少什么包裹 我已经安装了所有提到的另一个堆栈溢出线程 RMagick安装错误 https stackoverflow com qu
  • Rails - 渲染:目标锚标记的操作?

    我希望像这样使用渲染 render action gt page form 我也尝试过这个 render template gt site page form 那也没用 这个特定页面上的表单位于最底部 如果提交时发生任何错误 我不希望用户被
  • 用户未定义的方法 attr_accessible 错误

    我正在尝试创建某种登录 我创建了一个用户脚手架并将此代码放在我的 user rb 中 class User lt ActiveRecord Base attr accessible name password digest password
  • 我无法让 ruby​​ 开发工具包适用于 Windows XP

    所以 我一生都无法让它正常工作 我的最终目标是安装 dbd odbc gem 并使其正常工作 从我读过的多篇文章来看 我需要安装ODBC 绑定 http www ch werner de rubyodbc 对于 ruby 以及 dbd od
  • Shoulda/RSpec 匹配器 - 条件验证

    在我的代码中 我使用 Shoulda 匹配器进行了以下验证 效果很好 it should validate presence of name 在我的模型中 我已将条件添加到验证中 validates presence of name if
  • 什么是适合 Rails 3 的测试框架?

    去年我一直在使用 Ruby On Rails 但是 无法进行单元测试 现在我必须编写单元测试代码 哪个测试框架好 为什么 有这方面的好的教程吗 我的系统配置 Ruby 1 9 2 Rails 3 Ubuntu 10 第一个技巧是 尝试升级到
  • 正则表达式的 o 修饰符是什么意思?

    Ruby 正则表达式有一些选项 例如i x m o i例如 意味着忽略大小写 什么是o选项是什么意思 在ri Regexp 它说o意味着执行 仅插值一次 但是当我这样做时 a one b a a two b不改变 它保持 one 我缺少什么
  • 在 Sinatra 中运行后台进程

    我有 Sinatra Rails 应用程序和一个启动一些漫长过程的操作 通常我会为后台作业排队 但这种情况太简单了 后台进程很少启动 所以队列是一个开销 那么如何在没有队列的情况下运行后台进程呢 get build logs project
  • 使用 ruby​​ 调整动画 GIF 图像的大小?

    我正在尝试将 GIF 图像调整为不同的尺寸 我在 ruby 中使用 RMagick 库 但对于某些 gif 图像 即使我缩小 GIF 的大小 文件大小似乎也会增加 我正在以相同的纵横比调整图像图像的大小 这是我的代码 require rma

随机推荐