Tengine 的一个用例,Tengine 是 nginx 的即插即用替代品和分支
一些背景
我一直都是 nginx 的粉丝,一见钟情。
我倾向于首先将 nginx 用作 Web 内容和应用程序的反向代理服务器。这意味着 nginx 会将您的请求发送到后端服务器,并将它们的响应转发给您。
我使用的一些后端服务器示例
- php5-fpm 用于 PHP
- gunicorn 或 wsgi 用于 Python
- PSGI/Plack 或 fastcgi 用于 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 轻松访问数据的方法。使用此技术的产品的示例包括 Dropbox、Google Drive、Microsoft OneDrive 或 Amazon S3。Owncloud 也是一个不错的开源和自助托管的对象存储前端替代方案。
Openstack Swift & Ceph Object Gateway ¶
Openstack Swift 和 Ceph Object Gateway (RADOS Gateway) 是目前最流行的开源对象存储解决方案之一。
它们都类似,您将文件上传到代理服务器——Swift 代理服务器或 Ceph RADOS Gateway 服务器。这些代理服务器负责将文件发送回存储服务器,以确保数据的可用性和冗余。它看起来像这样
+-----------+ +--> | 存储 | | +-----------+ |
+-----+ 文件 +-------+ | +-----------+ | 您 | +----> | 代理 | +-----> | 存储 | +-----+ +-------+ | +-----------+ |
| +-----------+ +--> | 存储 | +-----------+
现在,在高度可用和分布式环境中,您可能有数十或数百个存储和代理服务器。有很多选择,您可能有像 haproxy、pound 或 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 也许也有一个光明的未来?
它可能只是开始在中国以外掀起波澜。
让我们拭目以待。