2

这个问题可能很明显,但我还不太明白。据我所知,Rails 应用程序是通过使用 Apache 或 nginx 之类的 Web 服务器或 Heroku 之类的云提供商来部署的。

像 Apache/nginx 这样的网络服务器的职责是什么。为什么 Rails 应用程序不能简单地在 WEBrick 上运行,仅通过运行rails server.

4

2 回答 2

2

我可能会将您的问题改写为“为什么 Ruby 应用程序中有单独的 Web 和应用程序层?”

在 Ruby 应用程序的生产部署中,通常有一个 Web 层(例如 Apache 或 Nginx)和一个应用程序层(例如 Unicorn、Thin、Passenger)。Web 层和应用程序层有不同的用途:

  1. Web 层 - 管理可能持久且长期存在的 HTTP 连接。通常负责生产部署的一些配置(通过重写规范化 URL,阻止错误请求的类别等)。有时负责 HTTPS 终止(尤其是在没有负载平衡器的环境中)。有时负责提供静态资产,这是 Web 服务器擅长的一项任务。大多数 Web 服务器可以处理数千个并发请求,每个请求所需的资源最少。因此,如果 Web 服务器可以在不影响应用层的情况下处理请求,则最好由 Web 服务器处理请求。

  2. 应用程序层 - 管理对应用程序本身的请求,这通常需要一定数量的应用程序逻辑和对数据存储层的访问。请求通常被认为是短暂的(最多几秒钟,理想情况下是几十毫秒,Rails 实时流除外)。应用程序层的并发性受到更多限制 - 大多数应用程序服务器可以处理的并发请求数量要少得多(瘦/独角兽每个进程 1 个)。

请注意,这种架构对于其他语言(PHP、Java)来说是相对常见的,因为这些差异在运行这些语言的系统中也很普遍。

可以使用统一的 Web 和应用程序层运行,但这通常需要一个将请求与线程或进程分离的系统——这意味着每个并发请求不需要线程或进程。它在开发方面增加了一些复杂性(请参阅 Node.js),但可以具有显着的可扩展性优势。

于 2013-10-20T02:47:34.947 回答
2

Basically, it sounds like your question is:

Q: Why not just use WebBrick as a production server (instead of only for RoR development)?

Here are several good discussions:

And from the Arch Linux documentation:

While the default Ruby On Rails HTTP server (WeBrick) is convenient for basic development it is not recommended for production use. Generally, you should choose between installing the Phusion Passenger module for your webserver (Apache or Nginx), or use a dedicated application-server (such as Mongrel or Unicorn) combined with a separate web-server acting as a reverse proxy.

于 2013-10-19T21:48:57.067 回答