引言

与其他语言的产品类似,使用 Ruby 开发的应用程序可以通过许多可用的 web 服务器之一向万维网公开。 虽然每个服务器都有其独特的特性,并且提供了不同的可能性来设计完美的解决方案,但是这些服务器有一个共同点: 与您的应用程序进行通信的方式(一个接口) ,称为 Rack。

在这篇 DigitalOcean 文章中,我们将比较各种支持基于 Ruby 的 web 应用的流行 web 服务器。 然而,在深入讨论之前,我们将介绍上面提到的流程背后的机制,因为我们熟悉 Rack 规范和中间件集合。

如果您对有些令人困惑的术语中间件到底意味着什么感到好奇,那么您可以在维基百科上阅读一些关于它的内容。

机架

如今,为开发人员提供将 web 服务器与 web 应用程序和其他技术相结合的机会,对于任何编程语言和框架来说,都是一个非常强大、必要和实际需求的方面。 这方面的一个非常基本的例子是开发、测试和 / 或生产对不同环境的需求。

为了实现这个目标,Christian Neukirchen 在2007年发布了 Rack,他称之为“模块化 Ruby web 服务器界面”。 今天,它被许多 web 服务器和 web 应用开发框架所采用,比如 Espresso、 Mack、 Ruby on Rails、 Sinatra 等等。

尽管存在跨[编程]语言和域的命名约定和各种解释,但是界面[应用程序]的规范非常相似,如果不是同源的话(虽然不像 Python 的 WSGI ——对 Rack 和其他应用程序的启发,Rack 这里不仅仅是一个规范,而且——也许有点令人困惑——也是一个中间件应用程序)。

Rack 中间件(gem)实现了 Rack 规范,通过将传入的 HTTP 请求划分为不同的流水线阶段,并将它们分块处理,直到它发回来自 web 应用程序(控制器)的响应。 它有两个不同的组件: 一个 Handler 和一个 Adapter,分别用于与 web 服务器和应用程序(框架)通信。

关于比较

在这个比较中,我们将讨论今天一些流行的和可用的 web 应用服务器选择。 我们将讨论是什么让一个人脱颖而出,以及他们在某些方面与其他人有何不同。 这里的目的是使您能够更好地全面理解,以便能够将服务器与您的应用程序的需求匹配起来,从而生成您需要的解决方案。

网络服务器(字母顺序)

Phusion Passenger: Fast web server & app server

现在的 Passenger 已经成为 Ruby on Rails 应用程序的推荐服务器。 它是一个成熟的、功能丰富的产品,旨在满足必要的需求和应用程序部署领域,同时大大简化设置和启动过程。 它通过直接集成 Apache 和 NGINX (面向前端) web 服务器,消除了传统的中间人服务器架构。 由于这个原因,在 Ruby (Rails)社区中,它也被称为 mod Rails / mod rack。

注释

Passenger 提供了处理驻留在同一服务器上的多个应用程序的能力。

它能够处理速度慢的客户端。 对 Passenger 的请求和响应是完全缓冲的,这使得 Passenger 不会受到针对阻塞系统资源的攻击。

乘客非常受欢迎,在许多[生产]场景中被广泛使用。 因此,你可以通过在线社区接触和寻找专家,也可以让你的问题得到解决。 它还有一个专门开发产品的公司,为那些感兴趣的人提供有效的商业支持。

它的开源版本有一个多进程单线程操作模式,而企业版本可以配置为单线程或多线程工作。

对于企业用户,Passenger 提供了一些进一步的“高级”特性,例如: 并发和多线程、集体部署、资源控制和限制等。

要了解更多关于 Passenger 的信息,你可以访问它的官方网站: https://www.phusionpassenger.com/ 。 对于客运企业,请访问同一页面的企业版块。

Puma: 一个现代的并发 Ruby Web 服务器

Puma 是一个 Rack 独有的 Ruby web 应用服务器。 它的创建和诞生在很大程度上受到了传统 Mongrel web 服务器的启发,Mongrel 服务器在发布期间发生了很大变革,并且影响了 Ruby 应用程序在未来几代(服务器)中的服务方式。 Puma 的开发人员 Evan Phoenix 决定继续开发,他改变了 Mongrel 的操作结构,使其只能在 Rack 上运行(从而消除了导致性能下降的复杂性) ,并设计了支持真正并行性的应用程序,从而实现了并发性(下面将进一步解释)。

注释

这个应用程序在大小和执行资源消耗方面都有很大的不足。

Puma 有几种工作模式: 它允许您设置用于完成工作的最小线程和最大线程数量,并且以集群模式工作,您可以使用分支进程并发地处理请求。

它基于 Mongrel 的解析器——以及对其代码库的大量重写。

尽管它被设计为 Rubinius 的“首选服务器” ,但它也能很好地与 JRuby 协同工作。

它提供了一个简单而重要的配置选项,可以通过多种方式适应 web 服务器的生产和开发需求。

虽然 Puma 不直接支持现成的多个应用程序的托管,但是它有 Jungle: a (Puma 作为服务)工具来帮助满足多个应用程序的生产需求。

要了解更多关于 Puma 的信息,你可以访问它位于 https://github.com/Puma/Puma 的官方代码库,在那里你也可以找到配置和开始的说明。

瘦: 小巧、快速、有趣的 HTTP 服务器

Thin 是一个非常流行的应用服务器,它自称是最“安全、稳定、快速和可扩展的 Ruby web 服务器”。 它是基于三个具有决定意义的 Ruby 库,因此也是它们的产物:

  • Mongrel 语法分析器
  • 事件计算机网络 i / o 库
  • 机架中间件

注释

瘦 HTTP 服务器被设计成与任何实现 Rack 规范的框架一起工作,而 Rack 规范现在已经覆盖了大多数。 它通过直接加载 Rack 配置文件来做到这一点。

作为一个基于事件 / 机器的应用服务器,Thin 能够处理长时间运行的请求,而不需要前端反向代理解决方案的帮助。

要了解更多关于 Thin 的信息,你可以访问它的官方网站,位于 http://code.macournoyer.com/Thin/ 。

快速客户端和 Unix 的机架 HTTP 服务器

Unicorn 是一个非常成熟的[ Ruby ] web 应用服务器,以至于它也适合与 Python 一起使用。 它功能齐全,但它否认设计上试图做任何事情: Unicorn 的主要任务是做需要(通过 web 应用服务器)完成的事情,并将其余的责任委派给那些做得更好的人。

注释

独角兽的主要工艺产生工人,根据您的要求,以服务的要求。 这个过程也监控工人,以防止记忆和处理相关的错位问题。 对于系统管理员来说,这意味着如果(例如)完成任务所需的时间过长或出现内存问题,就会杀死进程。

如上所述,Unicorn 委托任务的领域之一是使用操作系统进行负载平衡。 这样就可以避免对繁忙的工作人员提出越来越多的要求。

就像 NGINX 一样,使用 Unicorn,您可以执行和部署应用程序(考虑更新 / 升级) ,而不会丢失活动连接和客户端。

它的其他一些高级特性:

  • 所有工作线程都在给定的独立地址空间内运行,一次处理一个请求。
  • 前叉和后叉钩处理分叉过程。
  • 能够与复制对写友好的内存管理使用,以节省内存。
  • 侦听多个接口的能力。
想要了解更多关于麒麟的信息和它的特性,你可以访问它的官方网站,位于 http://Unicorn.bogomips.org/ 。