我经常读到关于Nginx和Mongrel一起使用的内容。有人可以向我解释他们是如何不同的吗?为什么需要Mongrel?为什么不建议让Nginx直接与许多Rails服务器通信?
答案 0 :(得分:22)
两者都是Web服务器,但它们没有共享相同的焦点:
要清楚,你的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是一种更合适的方法。
他们都是网络服务器。他们可以提供静态文件,但是 - 使用正确的模块 - 也可以提供动态网络应用,例如那些用PHP编写的。 Apache更受欢迎,功能更多,Nginx体积更小,速度更快,功能更少。
Apache和Nginx都无法提供开箱即用的Rails应用程序。要做到这一点,你需要将Apache / Nginx与某种附加组合结合使用,稍后将对此进行描述。
Apache和Nginx也可以充当反向代理,这意味着他们可以接收传入的HTTP请求并将其转发到另一个也说HTTP的服务器。当该服务器响应HTTP响应时,Apache / Nginx会将响应转发回客户端。稍后您将了解为什么这是相关的。
Mongrel是一个Ruby“应用程序服务器”。具体而言,这意味着Mongrel是一个应用程序:
WEBrick做同样的事情。与Mongrel的差异:
属于同一类别的另一个Ruby应用程序服务器是Thin。虽然它在内部与Mongrel和WEBrick不同,但在使用及其在服务器堆栈中的整体角色时,它属于同一类别。