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

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

【问题讨论】:

    标签: ruby-on-rails nginx mongrel


    【解决方案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 是一个应用程序:

      1. 将 Rails 应用加载到自己的进程空间中。
      2. 设置 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 有所不同,但在使用情况及其在服务器堆栈中的整体角色方面属于同一类别。

      【讨论】:

        猜你喜欢
        • 2012-05-30
        • 2018-11-20
        • 2016-04-06
        • 1970-01-01
        • 2017-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-08
        相关资源
        最近更新 更多