Nginx和Mongrel之间的区别?

时间:2012-10-04 10:07:41

标签: ruby-on-rails nginx mongrel

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

2 个答案:

答案 0 :(得分:22)

两者都是Web服务器,但它们没有共享相同的焦点:

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

要清楚,你的rails应用程序本身不能直接使用,它需要你可以称之为容器的东西(我建议你阅读一些关于http://rack.github.com/),在这种情况下是Mongrel。当你运行rails console时,它通常是webrick,我们在Ruby中拥有的最基本的web“app”服务器(它是标准库的一部分)。

那我们为什么要在前面使用Nginx?让我们考虑一下我们只使用Mongrel:我们触发一个mongrel实例,监听端口80.如果你的请求需要500毫秒才能完成,你可以每秒处理2个客户端。但等等,显然还不够。让我们解雇另一个mongrel实例。但是我们不能在端口80上听它,因为它已经被第一个实例使用了,我们无能为力。

所以我们需要一些可以处理多个Mongrel实例的东西,通过仍然监听端口80.你输入一个Nginx服务器,它将(代理)将请求分派给你的许多mongrel实例,你现在可以添加更多的实例同时为更多客户服务。

回到回答你的问题,让NGinx与rails服务器通信,意味着解雇一个或多个Mongrel(或Thin / Unicorn,无论服务器是什么),并通知NGinx它必须将请求传递给他们。在使用Passenger之后托管rails服务是一种流行的模式,它基本上为Apache工作者提供了处理ruby代码的方法。

答案 1 :(得分:11)

  

Nginx与Mongrel的区别

两者都是HTTP服务器,但它们的重点不同。杂种是 一个快速的HTTP服务器,主要针对基于Ruby的应用程序。它可以使用Ruby代码轻松扩展。但是,它不是很好 善于提供静态文件,即它比Apache和nginx慢。 此外,Rails是单线程的,这意味着在一个过程中 请求(调用控制器方法直到实际渲染) mongrel被锁定了。

解决上述Mongrel和 Rails,生产应用程序中的首选设置是放置 Apache或nginx作为主要的web服务器,如果请求非 收到静态Rails页面,将其传递给多个底层 mongrels,让mongrel将渲染的页面交还给Apache / nginx 并提供该页面,以及静态文件,如images / stylesheets / - 起初看起来有点令人生畏和复杂,但是 一旦你真正实现它,它是非常强大和稳定的(我 有几个已经运行了几个月到几年的应用程序 没有一次重启的服务器)。 归结起来,让Apache / nginx尽其所能,让它 mongrel集群做得最好,每个人都很开心。

在Apache上选择nginx主要是基于内存考虑因素。 Apache是​​一个非常庞大的网络服务器,特别是如果你真的这么做的话 用它来提供一些静态文件,并平衡其余的一堆 杂种Nginx非常轻巧,高性能,可以做到 同样的工作和Apache一样好。但如果你熟悉Apache, 不想得到nginx配置的掌握并且有很多 你的服务器上的内存,你仍然可以去Apache。在基本的VPS上, nginx是一种更合适的方法。

了解更多信息

Apache vs Nginx

他们都是网络服务器。他们可以提供静态文件,但是 - 使用正确的模块 - 也可以提供动态网络应用,例如那些用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响应(实际的字节数)并通过套接字将其发回。
  3. WEBrick做同样的事情。与Mongrel的差异:

    • 完全用Ruby编写。 Mongrel是Ruby部分C的一部分;主要是Ruby,但它的HTTP解析器是用C语言编写的,用于提高性能。
    • WEBrick速度较慢且不太健壮。它有一些已知的内存泄漏和一些已知的HTTP解析问题。
    • WEBrick通常仅在开发期间用作默认服务器,因为默认情况下WEBrick包含在Ruby中。 Mongrel需要单独安装。没有人在生产环境中使用WEBrick。

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