Tengine 的一个用例,Tengine 是 nginx 的即插即用替代品和分支

dmsimard

一些背景

我一直都是 nginx 的粉丝,一见钟情。

我倾向于首先将 nginx 用作 Web 内容和应用程序的反向代理服务器。这意味着 nginx 会将您的请求发送到后端服务器,并将它们的响应转发给您。

我使用的一些后端服务器示例
- php5-fpm 用于 PHP
- gunicornwsgi 用于 Python
- PSGI/Plackfastcgi 用于 Perl

现在,很酷的是,这些后端服务器擅长它们所做的事情:提供用特定语言编写的代码和应用程序。

将出色的轻量级代理和出色的后端服务器结合起来,您将获得出色的性能。
这与 Apache 形成对比,Apache 采用模块化方法:它试图自己完成所有事情——万金油,样样精通。

nginx 正在稳步 增加其市场份额,对抗 Apache 等竞争对手,理解原因并不复杂。

我告诉过您 nginx 还可以执行 SSL 终止 并用作 负载均衡器 吗?

Tengine

说够了 nginx,我们来谈谈 Tengine

您听说过 淘宝 吗?说实话,直到最近我才听说过。
原来他们在 Alexa 顶级网站 上排名第 8,紧随 Twitter 之后。
当中国占 世界人口的近 20% 时,即使在市场上渗透一小部分,实际上也意义重大。

Tengine 是淘宝团队创建的 nginx 分支。Tengine 中有很多功能尚未存在于 nginx 中,并且有些功能是上游维护者表示他们不会实现的功能。

一些亮点包括
- 继承了 Nginx-1.4.7 的所有功能,即它与 Nginx 100% 兼容。
- 支持动态模块加载 (DSO)。无需重新编译 Tengine。
- 将未缓冲的上传直接发送到后端服务器
- 更多负载均衡方法,例如一致性哈希和会话持久性
- 输入主体过滤器支持,用于 Web 应用程序防火墙等
- 日志增强:Syslog(本地或远程)、管道日志和日志采样

用例:对象存储

长话短说,对象存储 是一种在线存储数据并借助 API 轻松访问数据的方法。使用此技术的产品的示例包括 DropboxGoogle DriveMicrosoft OneDriveAmazon S3Owncloud 也是一个不错的开源和自助托管的对象存储前端替代方案。

Openstack Swift & Ceph Object Gateway

Openstack SwiftCeph Object Gateway (RADOS Gateway) 是目前最流行的开源对象存储解决方案之一。

它们都类似,您将文件上传到代理服务器——Swift 代理服务器或 Ceph RADOS Gateway 服务器。这些代理服务器负责将文件发送回存储服务器,以确保数据的可用性和冗余。它看起来像这样

+-----------+ +--> | 存储 | | +-----------+ |
+-----+ 文件 +-------+ | +-----------+ | 您 | +----> | 代理 | +-----> | 存储 | +-----+ +-------+ | +-----------+ |
| +-----------+ +--> | 存储 | +-----------+

现在,在高度可用和分布式环境中,您可能有数十或数百个存储和代理服务器。有很多选择,您可能有像 haproxypound 或 nginx 这样的负载均衡器。

在您的代理服务器前面使用负载均衡器后,您的设置现在如下所示

+-------+ +-----------+ +--> | 代理 | +--+--> | 存储 | | +-------+ | +-----------+ | |
+-----+ 文件 +---------------+ | +-------+ | +-----------+ | 您 | +----> | 负载均衡器 | +-----> | 代理 | +-----> | 存储 | +-----+ +---------------+ | +-------+ | +-----------+ | |
| +-------+ | +-----------+ +--> | 代理 | +--+--> | 存储 | +-------+ +-----------+

我注意到在使用 nginx 作为面向大量和频繁上传的服务器的负载均衡器时存在一个问题。nginx 缓冲请求主体,这在 nginx 邮件列表 中引发了很多讨论。

这实际上意味着文件被上传了两次。您将文件上传到充当反向代理/负载均衡器的 nginx,nginx 会等到文件上传完成后才会将其发送到可用的后端服务器之一。缓冲将在内存或实际文件中发生,具体取决于 配置

Tengine 最近在 Ceph 邮件列表 中被提出,作为解决问题的方案之一,所以我决定尝试一下,看看它的 无缓冲请求 对性能有什么影响。

一个非科学的测试

我使用 nginx 1.6.0 将 1GB 文件上传到对象存储集群。然后我将其替换为 Tengine 1.5.2 并再次尝试。交换 Web 服务器就像卸载 Nginx 并从 我构建的软件包 中安装 Tengine 一样简单。配置完全兼容,我只需要添加配置来禁用请求缓冲。

+----+ 1GB 文件 +---------------+ +-------+ +-----------+ | 我 | +---------> | 负载均衡器 | +---> | 代理 | +---> | 存储 | +----+ +---------------+ +-------+ +-----------+ 1Gbps 1Gbps

使用 nginx,上传需要 1 分钟 13 秒。
使用 Tengine,上传需要 41 秒。

这相差超过 30 秒!

结论

禁用缓冲所带来的差异让我感到震惊。
Tengine 确实是 nginx 的即插即用替代品,就像 MariaDB 5.5 是 MySQL 一样。
这个博客现在同时运行 Tengine 和 MariaDB,Tengine 也许也有一个光明的未来?

它可能只是开始在中国以外掀起波澜。

让我们拭目以待。