Nginx和Mongrel之间的区别?

use*_*220 12 mongrel ruby-on-rails nginx

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

jhc*_*ran 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代码的方法.


Dip*_*hal 11

Nginx和Mongrel之间的区别

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

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

在Apache上选择nginx主要是基于内存考虑因素.Apache是​​一个非常庞大的网络服务器,特别是如果你真正做的就是用它来提供一些静态文件,并在一堆杂种上平衡其余部分.Nginx非常轻巧,高性能,可以像Apache一样完成同样的工作.但是,如果您熟悉Apache,不希望得到nginx配置,并且在服务器上有大量内存,那么您仍然可以使用Apache.在基本的VPS上,nginx是一种更合适的方法.

了解更多信息

Apache vs Nginx

他们都是网络服务器.它们可以提供静态文件,但是 - 使用正确的模块 - 也可以提供动态Web应用程序,例如用PHP编写的应用程序.Apache更受欢迎,功能更多,Nginx体积更小,速度更快,功能更少.

Apache和Nginx都无法提供开箱即用的Rails应用程序.为此,您需要将Apache/Nginx与某种附加组件结合使用,稍后将对此进行介绍.

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

Mongrel与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在内部不同,但在使用及其在服务器堆栈中的整体角色时,它属于同一类别.