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

最佳答案

两者都是Web服务器,但是它们没有相同的关注点:

  • Mongrel基本上是一个提供HTTP接口(interface)的 ruby 应用服务器。它做一件事,接受一个请求,将其传递给您的ruby代码,并将答案提供回http。它不处理并发或任何与性能相关的功能。一只杂种意味着有一个 ruby 处理程序可以处理请求。
  • Nginx是功能齐全的Web服务器,旨在提高性能。它可以在静态文件上提供高性能,并且不能直接处理Ruby,Python或任何其他语言。它依靠FastGCI或代理到其他应用程序服务器来执行此操作。

  • 需要明确的是,Rails应用程序本身不能直接使用,它需要可以称为容器的容器(我建议您阅读有关http://rack.github.com/的内容),在本例中为Mongrel。当您运行Rails控制台时,通常是webrick,这是我们在Ruby中拥有的最基本的Web“应用”服务器(它是标准库的一部分)。

    那为什么要在前面使用Nginx呢?考虑到我们仅使用Mongrel:我们触发一个mongrel实例,监听端口80。例如,如果您的请求需要500毫秒才能完成,则您每秒可以处理2个客户端。但是,等待显然还不够。让我们开另一个杂种。但是我们不能让它在端口80上监听,因为它已经被第一个实例使用,并且我们对此无能为力。

    因此,我们需要在前端需要一些东西,通过仍然监听端口80来处理多个Mongrel实例。您抛出了一个Nginx服务器,它将(代理)将请求分派(dispatch)到您的多个Mongrel实例,现在您可以添加更多实例以提供更多服务客户同时进行。

    回到回答您的问题,让NGinx与Rails服务器通信,意味着触发一个或多个Mongrel(或Thin/Unicorn,无论可用的服务器是什么),并通知NGinx必须将请求传递给它们。这是一种流行的模式,除了使用Passenger之外,还托管了Rails服务,这基本上为Apache worker 提供了一种处理ruby代码的方法。

    关于ruby-on-rails - Nginx和Mongrel之间的区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12724943/

    10-08 22:33