在 EC2 上以经济高效的方式终止大量 SSL 连接

在 EC2 上以经济高效的方式终止大量 SSL 连接

我最近设置了一个基于 Node.js 的 Web 套接字服务器,该服务器经过测试,可以在小型 EC2 实例 (m1.small) 上每秒处理大约 2,000 个新连接请求。考虑到 m1.small 实例的成本,以及将多个实例置于支持 WebSocket 的代理服务器(如 HAProxy)之后的能力,我们对结果非常满意。

然而,我们意识到我们还没有使用 SSL 进行任何测试,因此研究了许多 SSL 选项。显然,在代理服务器上终止 SSL 连接是理想的选择,因为这样代理服务器就可以检查流量并插入 X-Forward-For 等标头,这样服务器就知道请求来自哪个 IP。

我研究过的 SSL 终止解决方案包括 Pound、stunnel 和 stud,它们都允许终止 443 上的传入连接,然后传递到端口 80 上的 HAProxy,后者又将连接传递到 Web 服务器。然而不幸的是,我发现在 c1.medium(高 CPU)实例上向 SSL 终止代理服务器发送流量会很快消耗所有 CPU 资源,而且每秒仅处理 50 个左右的请求。我尝试使用上面列出的所有三种解决方案,它们的性能大致相同,因为我假设它们在底层都依赖于 OpenSSL。我尝试使用 64 位非常大的高 CPU 实例(c1.xlarge),发现性能仅与成本成线性关系。因此,根据 EC2 定价,我需要为每秒 200 个 SSL 请求支付大约 600 美元/月,而为每秒 2,000 个非 SSL 请求支付 60 美元/月。当我们开始计划每秒接受数千或数万个请求时,前一种价格很快就会变得经济上不可行。

我也尝试使用 Node.js 的 https 服务器终止 SSL,其性能与 Pound、stunnel 和 stud 非常相似,因此这种方法没有明显的优势。

所以我希望有人能帮助我,建议我如何解决提供 SSL 连接所必须承担的荒谬成本。我听说 SSL 硬件加速器提供了更好的性能,因为硬件是为 SSL 加密和解密而设计的,但由于我们目前为所有服务器使用 Amazon EC2,因此除非我们拥有带有物理服务器的独立数据中心,否则使用 SSL 硬件加速器不是一种选择。我只是很难理解,在成本如此之高的情况下,亚马逊、谷歌、Facebook 等公司如何通过 SSL 提供所有流量。一定有更好的解决方案。

任何建议或想法都将不胜感激。

谢谢马特

答案1

首先,你开始进行基准测试,这很好。从那里我的直觉让我想知道你使用的密钥大小。在我看来,你应该能够终止每秒超过 200 个连接。如果您使用的密钥大小大于 1024,知道性能会很快下降

如果您使用较小的密钥但仍然遇到问题,我会仔细研究 EC2 提供的 GPU 产品。SSL着色器在达到每秒一定数量的连接之后,可能是一种具有成本效益的转换。

此外,调查@ceejayoz 提到的 Elastic Load Balancer 也是有价值的。

答案2

您可能做错了基准测试。我怀疑您真的期望每秒有 200 个新的 SSL 访问者吗?如果这些连接中的任何一个是来自最近访问过的人的重新连接,那么您应该使用 SSL 缓存 - 这类东西:

服务器.on('newSession',函数(id,数据){tlsSessionStore [id] = data;});

服务器.on('resumeSession',函数(id,cb){cb(null,tlsSessionStore [id] || null); });

当然,您的基准测试需要在您的测试中呈现出对您的应用程序有意义的正确比例的全新连接和恢复/重用会话。

另外 - 如前所述,您选择的密码和密钥大小可能也会影响速度。

答案3

看来 SSL 速度取决于算法和所需的安全级别,我还没有对我的 EC2 实例进行基准测试,但无论如何我想与大家分享一些关于启用 Google 风格的 ECDHE 密钥交换和预先选择的 SSL 算法的技巧,以避免 BEAST 和其他 SSL 错误配置。

一些很好的入门链接:(没有一个地方拥有一切,我应该写一本手册,但在此之前,如果有人想贡献链接和提示,我已经将这篇文章设为社区维基!)

看看https://www.vbulletin.com/forum/showthread.php/401411-Time-to-improve-the-site-security关于为什么 SSL 现在不再是“仅仅是 SSL”的一些讨论。

相关内容