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 对象 网关 ¶
Openstack Swift 和 Ceph 对象网关 (RADOS Gateway) 是目前最流行的开源对象存储解决方案之 二。
它们都类似,您将文件上传到代理服务器——Swift 代理服务器或 Ceph RADOS 网关服务器。这些代理服务器负责将文件发送回存储服务器,以确保数据的可用性和冗余 。
它看起来有点像 这样
+-----------+ +--> | 存储 | | +-----------+ |
+-----+ 文件 +-------+ | +-----------+ | 您 | +----> | 代理 | +-----> | 存储 | +-----+ +-------+ | +-----------+ |
| +-----------+ +--> | 存储 | +-----------+
现在,在高度可用和分布式环境中,您可能有数十或数百个存储和代理服务器。有很多选择,您可能有像 haproxy、pound 或 nginx 用于负载 均衡。
在您的代理服务器前面使用负载均衡器,您的设置现在看起来像 这样
+-------+ +-----------+ +--> | 代理 | +--+--> | 存储 | | +-------+ | +-----------+ | |
+-----+ 文件 +---------------+ | +-------+ | +-----------+ | 您 | +----> | 负载均衡器 | +-----> | 代理 | +-----> | 存储 | +-----+ +---------------+ | +-------+ | +-----------+ | |
| +-------+ | +-----------+ +--> | 代理 | +--+--> | 存储 | +-------+ +-----------+
我注意到在使用 nginx 作为面向大量和频繁上传的服务器的负载均衡器时出现了一个问题。nginx 缓冲请求的主体,这在 nginx 邮件列表中引起了很多讨论。
这实际上意味着文件被上传两次。您将文件上传到 nginx,nginx 充当反向代理/负载均衡器,nginx 会等到文件上传完成后才会将其发送到可用的后端服务器之一。缓冲将在内存或实际文件中发生,具体取决于 配置。
Tengine 最近在 Ceph 邮件列表中被提出,作为解决问题的方案之一,所以我决定尝试一下,看看它的 无缓冲请求对性能有什么影响 。
一个非科学的 测试 ¶
我将一个 1GB 文件上传到带有 nginx 1.6.0 的对象存储集群。然后我将其替换为 Tengine 1.5.2 并再次尝试。交换 Web 服务器就像卸载 Nginx 并从 我构建的包中安装 Tengine 一样简单。配置完全兼容,我只需要添加配置来禁用请求 缓冲。
布局如下 所示
+----+ 1GB 文件 +---------------+ +-------+ +-----------+ | 我 | +---------> | 负载均衡器 | +---> | 代理 | +---> | 存储 | +----+ +---------------+ +-------+ +-----------+ 1Gbps 1Gbps
使用 nginx,上传需要 1 分钟 13 秒。
使用 Tengine,上传需要 41 秒。
这相差超过 30 秒 !
结论 ¶
禁用缓冲所带来的差异让我感到震惊。
Tengine 确实是 Nginx 的即插即用替代品,就像 MariaDB 5.5 是 MySQL 的替代品一样。
这个博客现在运行 Tengine,也许淘宝的团队也有一个光明的未来 ?
它可能只是开始在中国以外的地方掀起波澜。让我们拭目以待 。