我经常读到 Nginx 和 Mongrel 一起使用。有人可以向我解释它们有何不同吗?为什么需要 Mongrel?为什么不建议让 Nginx 直接与许多 Rails 服务器通信?
2 回答
两者都是 Web 服务器,但它们的关注点不同:
- 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 代码的方法。
Nginx 和 Mongrel 的区别
两者确实都是 HTTP 服务器,但它们的侧重点不同。Mongrel 是一个快速的 HTTP 服务器,主要针对基于 Ruby 的应用程序。它可以使用 Ruby 代码轻松扩展。但是,它在提供静态文件方面不是很好,即它比 Apache 和 nginx 慢。此外,Rails 是单线程的,这意味着在请求过程中(调用控制器方法直到实际呈现)mongrel 被锁定。
为了解决上述 Mongrel 和 Rails 的缺点,生产应用程序中的首选设置是将 Apache 或 nginx 作为主 Web 服务器,如果收到对非静态 Rails 页面的请求,则将其传递给一个数字底层的 mongrel,让 mongrel 将渲染的页面交还给 Apache/nginx 并提供该页面,以及诸如图像/样式表/之类的静态文件……一开始可能看起来有点令人生畏和复杂,但一旦你真正实现它非常强大和稳定(我有几个应用程序已经在服务器上运行了几个月到几年而无需重新启动)。归根结底就是,让Apache/nginx做自己擅长的事情,让mongrel集群做自己擅长的事情,大家开心就好。
选择 nginx 而不是 Apache 主要是基于内存考虑。Apache 是一个非常强大的网络服务器,特别是如果你实际上所做的只是用它提供一些静态文件并将其余部分平衡在一堆杂种上。Nginx 非常轻量级和高性能,可以完成与 Apache 一样好的工作。但是,如果您熟悉 Apache,不想掌握 nginx 配置并且您的服务器上有大量内存,您仍然可以选择 Apache。在基本的 VPS 上,nginx 是一种更合适的方法。
为您提供更多信息
阿帕奇与 Nginx
它们都是 Web 服务器。它们可以提供静态文件,但 - 使用正确的模块 - 也可以提供动态 Web 应用程序,例如那些用 PHP 编写的应用程序。Apache更流行,功能更多,Nginx更小更快,功能更少。
Apache 和 Nginx 都不能为 Rails 应用程序提供开箱即用的服务。为此,您需要将 Apache/Nginx 与某种附加组件结合使用,稍后将进行介绍。
Apache 和 Nginx 也可以充当反向代理,这意味着它们可以接收传入的 HTTP 请求并将其转发到另一个也使用 HTTP 的服务器。当该服务器响应 HTTP 响应时,Apache/Nginx 会将响应转发回客户端。稍后您将了解为什么这是相关的。
Mongrel vs WEBrick
Mongrel 是一个 Ruby 的“应用服务器”。具体而言,这意味着 Mongrel 是一个应用程序,它:
- 在自己的进程空间中加载您的 Rails 应用程序。
- 设置一个 TCP 套接字,允许它与外部世界(例如 Internet)进行通信。Mongrel 在此套接字上侦听 HTTP 请求并将请求数据传递给 Rails 应用程序。然后,Rails 应用程序返回一个对象,该对象描述 HTTP 响应的外观,Mongrel 负责将其转换为实际的 HTTP 响应(实际字节)并通过套接字将其发送回。
WEBrick 做同样的事情。与杂种的区别:
- 它完全用 Ruby 编写。Mongrel 是 Ruby 部分 C 部分;主要是 Ruby,但它的 HTTP 解析器是用 C 编写的以提高性能。
- WEBrick 速度较慢且不太健壮。它有一些已知的内存泄漏和一些已知的 HTTP 解析问题。
- WEBrick 通常仅在开发过程中用作默认服务器,因为 Ruby 默认包含 WEBrick。Mongrel 需要单独安装。没有人在生产环境中使用 WEBrick。
另一个属于同一类别的 Ruby 应用程序服务器是 Thin。虽然它在内部与 Mongrel 和 WEBrick 有所不同,但在使用情况及其在服务器堆栈中的整体角色方面属于同一类别。