【问题标题】:How can a Rails app run with Puma alone by default - without a web serverRails 应用程序如何在默认情况下单独使用 Puma 运行 - 没有 Web 服务器
【发布时间】:2021-10-08 15:54:52
【问题描述】:

生成动态内容的网络应用程序需要两个组件:

  1. Web 服务器 - 主要通过在提供内容的同时处理 HTTP 请求和响应与客户端进行通信。
  2. 应用服务器 - 另一方面,通常位于 Web 服务器后面。如果网络服务器无法通过静态文件生成请求的内容,则到达应用服务器生成动态内容。

软件示例

Web 服务器和应用程序服务器作为典型 Web 应用程序中的组件一起工作。

在生产环境中运行 Rails

当使用乘客在生产环境中运行 Rails 应用程序时,一些选项包括:

  • Running Passenger 作为独立解决方案
  • 将 Passenger 作为应用服务器运行,Apache/Nginx 作为 Web 服务器运行

在开发中运行 Rails

在开发中运行 Rails 应用程序时,默认配置为使用 Puma - see Ruby Docs。 Puma 是一个应用服务器。为什么默认情况下,在 Rails 中,Puma 可以自己运行整个 Web 应用程序?在应用程序堆栈中没有提到像 Nginx 或 Apache 这样的 Web 服务器。

我不明白这怎么可能。有人可以解释一下吗? Puma 一直是应用服务器,而不是 Web 服务器……

提前致谢。

【问题讨论】:

  • “Puma 一直是应用服务器,而不是 Web 服务器”? puma 的创造者们似乎有不同的看法。引用puma README:“Puma:为并发构建的 Ruby Web 服务器”
  • @spickermann 感谢您的参考。看起来是这样的,尽管这个领域的大多数软件最初都是作为应用程序服务器或 Web 服务器开始的,但它的创建者确实在推动独立的解决方案(Web 应用程序服务器)。

标签: ruby-on-rails ruby nginx passenger puma


【解决方案1】:

“Web 服务器”和“应用程序服务器”之间的区别相当模糊,并且有很多隐含的(而且主要是历史性的)包袱。

通常,Web 服务器被理解为通过 HTTP(或 HTTPS)与客户端通信并发送静态文件作为对请求的响应的软件。

另一方面,应用服务器通常不直接与客户端通信(而是与它前面的中间服务器系统通信,例如负载平衡器、代理服务器或网络服务器),它的主要功能是响应请求动态生成的内容。应用服务器有时会使用 HTTP 以外的协议(例如 FCGI 或 AJP)与这些中间服务器通信。

我们经常会看到经典的网络服务器(如 nginx、Apache、lighttpd)与 Puma、Unicorn、Thin 或Passenger 等应用服务器一起使用。原因是这些网络服务器在提供静态文件方面比应用程序服务器更有效,后者更适合帮助应用程序生成动态响应。此外,在不使用大量资源的情况下,Web 服务器可能比应用程序服务器更适合缓冲来自客户端的请求和响应。

话虽如此,在过去的几十年里,在任何地方都使用 HTTP 而不是使用例如 HTTP 变得越来越普遍。 FCGI 内部。因此,应用程序服务器通常能够自行与 HTTP 客户端通信,而无需严格要求额外的 Web 服务器。通常,这些应用程序服务器也可以直接提供静态文件,因此也具有网络服务器的大部分功能。

但是,如上所述,大多数网络服务器在提供静态文件时速度更快且可扩展性更高。此外,由于 Unicorn 不能有效地缓冲请求和响应,某些应用程序服务器(例如 Unicorn)并不打算直接暴露给客户端。相反,他们依赖于 nginx 等前端服务器。

因此,作为一个结论:大多数 Ruby 应用程序服务器都可以在没有网络服务器的情况下直接使用。与例如彪马这将工作得很好。为了更有效地服务静态资产,或者负载均衡或保护您的应用程序,您还可以在您的应用程序服务器(如 nginx 或 Apache)前引入 Web 服务器/代理。

【讨论】:

  • 非常感谢您的详细解释。它消除了围绕这个主题的很多困惑。
猜你喜欢
  • 1970-01-01
  • 2019-07-25
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 1970-01-01
  • 2018-11-19
相关资源
最近更新 更多