Nginx 和 Mongrel 的区别?

Posted

技术标签:

【中文标题】Nginx 和 Mongrel 的区别?【英文标题】:Difference between Nginx and Mongrel? 【发布时间】:2012-09-25 08:26:57 【问题描述】:

我经常读到 nginx 和 Mongrel 一起使用。有人可以向我解释它们有何不同吗?为什么需要 Mongrel?为什么不建议让 Nginx 直接与多个 Rails 服务器通信?

【问题讨论】:

【参考方案1】:

两者都是网络服务器,但它们的关注点不同:

Mongrel 基本上是一个提供 HTTP 接口的 ruby​​ 应用程序服务器。它只做一件事,接受一个请求,将它传递给你的 ruby​​ 代码,然后在 http 中返回答案。它不处理并发性或任何与性能相关的功能。一个 mongrel 意味着有一个 ruby​​ 进程可以处理请求。 Nginx 是一个功能齐全的 Web 服务器,旨在实现性能。它可以在静态文件上提供高性能,并且不能直接处理 Ruby、Python 或任何其他语言。它依靠 FastGCI 或代理到其他应用程序服务器来做到这一点。

需要明确的是,你的 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代码的方法。

【讨论】:

【参考方案2】:

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 是更合适的方法。

供您了解更多信息

Apache 与 Nginx

它们都是网络服务器。它们可以提供静态文件,但 - 使用正确的模块 - 也可以提供动态 Web 应用程序,例如那些用 php 编写的。 Apache更流行,功能更多,Nginx更小更快,功能更少。

Apache 和 Nginx 都不能为 Rails 应用提供开箱即用的服务。为此,您需要将 Apache/Nginx 与某种附加组件结合使用,稍后将介绍。

Apache 和 Nginx 也可以充当反向代理,这意味着它们可以接收传入的 HTTP 请求并将其转发到另一个也使用 HTTP 的服务器。当该服务器响应 HTTP 响应时,Apache/Nginx 会将响应转发回客户端。稍后您将了解为什么这是相关的。

Mongrel vs WEBrick

Mongrel 是一个 Ruby 的“应用服务器”。具体而言,这意味着 Mongrel 是一个应用程序:

    将 Rails 应用加载到自己的进程空间中。 设置 TCP 套接字,允许它与外部世界(例如 Internet)通信。 Mongrel 在此套接字上侦听 HTTP 请求并将请求数据传递给 Rails 应用程序。然后,Rails 应用程序返回一个对象,该对象描述 HTTP 响应的外观,Mongrel 负责将其转换为实际的 HTTP 响应(实际字节)并通过套接字将其发送回。

WEBrick 做同样的事情。与 Mongrel 的区别:

它完全用 Ruby 编写。 Mongrel 是 Ruby 部分 C 部分;主要是 Ruby,但它的 HTTP 解析器是用 C 编写的以提高性能。 WEBrick 速度较慢且稳定性较差。它有一些已知的内存泄漏和一些已知的 HTTP 解析问题。 WEBrick 通常仅在开发过程中用作默认服务器,因为 WEBrick 默认包含在 Ruby 中。 Mongrel 需要单独安装。没有人在生产环境中使用 WEBrick。

另一个属于同一类别的 Ruby 应用服务器是 Thin。虽然它在内部与 Mongrel 和 WEBrick 有所不同,但在使用情况及其在服务器堆栈中的整体角色方面属于同一类别。

【讨论】:

以上是关于Nginx 和 Mongrel 的区别?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 Mongrel2?

我应该为我的 Rails 应用程序使用 Apache 还是 Nginx &Passenger 或 Mongrel

如何在 Mongrel 下重启 Rails,而不停止和启动 Mongrel

通过 Rails 2.3 使用 x-sendfile 通过 Nginx 提供大文件

带有 RVM 的 Rails mongrel 无法启动 - mongrel_rails (MissingSourceFile)

Rails 应用程序和 Mongrel 的奇怪问题