【发布时间】:2012-09-25 08:26:57
【问题描述】:
我经常读到 Nginx 和 Mongrel 一起使用。有人可以向我解释它们有何不同吗?为什么需要 Mongrel?为什么不建议让 Nginx 直接与多个 Rails 服务器通信?
【问题讨论】:
标签: ruby-on-rails nginx mongrel
我经常读到 Nginx 和 Mongrel 一起使用。有人可以向我解释它们有何不同吗?为什么需要 Mongrel?为什么不建议让 Nginx 直接与多个 Rails 服务器通信?
【问题讨论】:
标签: ruby-on-rails nginx mongrel
两者都是网络服务器,但它们的关注点不同:
需要明确的是,你的 rails 应用程序本身不能直接使用,它需要你可以称之为容器的东西(我建议你阅读一些关于 http://rack.github.com/ 的内容),在这种情况下是 Mongrel。当您运行 rails 控制台时,它通常是 webrick,这是我们在 Ruby 中拥有的最基本的网络“应用程序”服务器(它是标准库的一部分)。
那我们为什么要在前面使用 Nginx 呢?假设我们只使用 Mongrel :我们触发一个 mongrel 实例,侦听端口 80。如果您的请求需要例如 500 毫秒才能完成,那么您每秒只能处理 2 个客户端。但是等待显然是不够的。让我们启动另一个杂种实例。但是我们不能让它监听端口 80,因为它已经被第一个实例使用了,我们对此无能为力。
所以我们需要一个可以处理多个 Mongrel 实例的东西,仍然侦听端口 80。你投入一个 Nginx 服务器,它将(代理)将请求分派到你的许多 Mongrel 实例,你现在可以添加更多实例同时服务更多客户。
回到回答你的问题,让 NGinx 与 Rails 服务器通信,意味着触发一个或多个 Mongrel(或 Thin / Unicorn,无论可用的服务器)并通知 NGinx 它必须将请求传递给它们。除了使用Passenger之外,托管rails服务是一种流行的模式,它基本上为Apache工作人员提供了一种处理ruby代码的方法。
【讨论】:
Nginx 和 Mongrel 的区别
两者确实都是 HTTP 服务器,但它们的侧重点不同。杂种是 一个快速的 HTTP 服务器,主要针对基于 Ruby 的应用程序。它可以使用 Ruby 代码轻松扩展。然而,并不是很 擅长提供静态文件,即它比 Apache 和 nginx 慢。 此外,Rails 是单线程的,这意味着在运行过程中 请求(调用控制器方法直到实际呈现) 杂种被锁定。
解决上述 Mongrel 和 Rails,生产应用程序中的首选设置是放置 Apache 或 nginx 作为主网络服务器,如果请求非 接收到静态 Rails 页面,将此传递给一些底层 mongrel,让 mongrel 将渲染的页面交还给 Apache/nginx 并提供该页面,以及图像/等静态文件 stylesheets/……乍一看可能有点令人生畏和复杂,但是 一旦你真正实现它,它就会非常强大和稳定(我 有几个应用程序已经运行了几个月到几年 服务器无需重新启动)。 归结为,让 Apache/nginx 做它最擅长的事情,让 杂种集群各有所长,大家开心。
选择 nginx 而不是 Apache 主要是基于内存考虑。 Apache 是一个相当强大的网络服务器,特别是如果你实际上所做的一切 是用它提供一些静态文件,并在一堆中平衡其余文件 杂种。 Nginx 非常轻量级和高性能,可以做到 与 Apache 一样出色的工作。但如果你熟悉 Apache, 不想掌握 nginx 配置并且有很多 你的服务器上的内存,你仍然可以去 Apache。在基本的 VPS 上, nginx 是更合适的方法。
它们都是网络服务器。它们可以提供静态文件,但 - 使用正确的模块 - 也可以提供动态 Web 应用程序,例如那些用 PHP 编写的。 Apache更流行,功能更多,Nginx更小更快,功能更少。
Apache 和 Nginx 都不能为 Rails 应用提供开箱即用的服务。为此,您需要将 Apache/Nginx 与某种附加组件结合使用,稍后将介绍。
Apache 和 Nginx 也可以充当反向代理,这意味着它们可以接收传入的 HTTP 请求并将其转发到另一个也使用 HTTP 的服务器。当该服务器响应 HTTP 响应时,Apache/Nginx 会将响应转发回客户端。稍后您将了解为什么这是相关的。
Mongrel 是一个 Ruby 的“应用服务器”。具体而言,这意味着 Mongrel 是一个应用程序:
WEBrick 做同样的事情。与 Mongrel 的区别:
另一个属于同一类别的 Ruby 应用服务器是 Thin。虽然它在内部与 Mongrel 和 WEBrick 有所不同,但在使用情况及其在服务器堆栈中的整体角色方面属于同一类别。
【讨论】: