默认情况下,Rails 应用程序如何在没有 Web 服务器的情况下单独使用 Puma 运行

Mas*_*son 5 ruby ruby-on-rails passenger nginx puma

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

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

软件示例

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

生产中的运行轨道

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

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

开发中运行 Rails

在开发中运行 Rails 应用程序时,它默认配置为使用 Puma -请参阅 Ruby 文档。Puma 是一个应用服务器。默认情况下,在 Rails 中,Puma 为何可以自行运行整个 Web 应用程序?应用程序堆栈中没有提及像 Nginx 或 Apache 这样的 Web 服务器。

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

提前致谢。

Hol*_*ust 8

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

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

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

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

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

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

因此,作为一个结论:大多数 Ruby 应用程序服务器都可以在没有 Web 服务器的情况下直接使用。对于例如 Puma,这将非常有效。为了更有效地服务静态资产,或者负载平衡或保护您的应用程序,您还可以在应用程序服务器前面引入一个 Web 服务器/代理,例如 nginx 或 Apache。