【发布时间】:2013-10-28 14:05:09
【问题描述】:
这个问题可能很明显,但我还不太明白。据我所知,Rails 应用程序是通过使用 Apache 或 nginx 之类的 Web 服务器或 Heroku 之类的云提供商来部署的。
像 Apache/nginx 这样的网络服务器的职责是什么。为什么 Rails 应用程序不是简单地通过运行 rails server 在 WEBrick 上运行。
【问题讨论】:
标签: ruby-on-rails apache nginx
这个问题可能很明显,但我还不太明白。据我所知,Rails 应用程序是通过使用 Apache 或 nginx 之类的 Web 服务器或 Heroku 之类的云提供商来部署的。
像 Apache/nginx 这样的网络服务器的职责是什么。为什么 Rails 应用程序不是简单地通过运行 rails server 在 WEBrick 上运行。
【问题讨论】:
标签: ruby-on-rails apache nginx
基本上,听起来你的问题是:
问:为什么不只使用 WebBrick 作为生产服务器(而不仅仅是 用于 RoR 开发)?
这里有几个很好的讨论:
虽然默认的 Ruby On Rails HTTP 服务器 (WeBrick) 很方便 对于基本开发,不建议将其用于生产用途。 通常,您应该在安装 Phusion Passenger 之间进行选择 您的网络服务器(Apache 或 Nginx)的模块,或使用专用的 应用程序服务器(例如 Mongrel 或 Unicorn)与 单独的网络服务器充当反向代理。
【讨论】:
我可能会将您的问题重新表述为“为什么 Ruby 应用程序中有单独的 Web 和应用程序层?”
在 Ruby 应用程序的生产部署中,通常有一个 Web 层(例如 Apache 或 Nginx)和一个应用程序层(例如 Unicorn、Thin、Passenger)。 Web 层和应用层有不同的用途:
Web 层 - 管理 HTTP 连接,这些连接可能是持久的和长期存在的。通常负责生产部署的一些配置(通过重写规范化 URL,阻止错误请求的类别等)。有时负责 HTTPS 终止(尤其是在没有负载平衡器的环境中)。有时负责提供静态资产,这是 Web 服务器擅长的一项任务。大多数 Web 服务器可以处理数千个并发请求,每个请求所需的资源最少。因此,如果 Web 服务器可以在不影响应用层的情况下处理请求,则最好由 Web 服务器来处理请求。
应用层 - 管理对应用本身的请求,这通常需要一定数量的应用逻辑和对数据存储层的访问。请求通常被认为是短暂的(最多几秒钟,理想情况下为几十毫秒,Rails 实时流除外)。应用程序层的并发性受到更多限制 - 大多数应用程序服务器可以处理更少数量的并发请求(瘦/独角兽每个进程 1 个)。
请注意,这种架构对于其他语言(PHP、Java)来说是相对常见的,因为这些差异在很大程度上也适用于运行这些语言的系统。
可以使用统一的 Web 和应用程序层运行,但这通常需要一个将请求与线程或进程分离的系统 - 这意味着每个并发请求都不需要线程或进程。它在开发方面增加了一些复杂性(请参阅 Node.js),但可以带来显着的可扩展性优势。
【讨论】: