Rails 应用程序 运行 如何默认单独使用 Puma - 没有网络服务器

How can a Rails app run with Puma alone by default - without a web server

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

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

软件示例

Web 服务器和应用程序服务器在典型的 Web 应用程序中作为组件协同工作。

运行 Rails 生产中

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

运行 Rails 开发中

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

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

提前致谢。

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

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

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

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

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

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

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