经济高效地终止大量SSL连接

Mat*_*dan 13 ssl openssl haproxy stunnel node.js

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

但是,我们意识到我们尚未使用SSL进行任何测试,因此研究了许多SSL选项.很明显,终止代理服务器上的SSL连接是理想的,因为代理服务器可以检查流量并插入诸如X-Forward-For之类的标头,以便服务器知道请求来自哪个IP.

所以我研究了许多解决方案,如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美元/米.当我们开始计划每秒接受1,000或10,000个请求时,前一个价格在很快就变得经济上不可行.

我也尝试使用Node.js的https服务器终止SSL,性能与Pound,stunnel和stud非常相似,所以没有明显的优势.

因此,我希望有人可以提供帮助,建议我如何克服这个荒谬的成本,我们必须吸收提供SSL连接.我听说SSL硬件加速器提供了更好的性能,因为硬件设计用于SSL加密和解密,但由于我们目前正在为所有服务器使用Amazon EC2,因此除非我们有单独的数据,否则不能使用SSL硬件加速器以物理服务器为中心.我只是在努力想知道亚马逊,谷歌,Facebook等公司如何能够通过SSL提供所有流量,而其成本如此之高.那里必须有更好的解决方案.

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

谢谢马特

Gna*_*foz 5

我不太了解不同EC2实例上可用的CPU功率,但我认为您的问题不在于您选择的TLS终止代理软件,而在于它们的配置.没有任何配置,我假设他们所有人都会提供他们支持的所有密码套件,包括(非常)慢的密码套件.他们可能会让客户选择最喜欢的那个.

并非所有TLS密码套件都是相同的,有些套件的CPU成本高于其他套件,无论是密钥交换机还是密码本身.根据所使用的软件,应该有一种方法来指定服务器接受的密码串(以及使服务器坚持的方法).对于OpenSSL,这些工作方式如下:http://www.openssl.org/docs/apps/ciphers.html#CIPHER_STRINGS

如果你想要速度,至少要确保你没有使用采用Diffie-Hellmann(非椭圆曲线类型)密钥交换的密码.要使用DH密钥交换禁用密码套件,请确保字符串包含!DH在某些位置.例如,您可以测试哪些字符串会导致哪些密码可用openssl ciphers -v 'HIGH:!aNULL:!DH:!ECDH'.

该字符串禁用正常的Diffie-Hellman以及Elliptic Curve Diffie-Hellmann密钥交换.这可能只会留下RSA密钥交换,具体取决于您的OpenSSL版本.

关于密码,您应该测试您想要的EC2硬件.如果没有硬件加速,你应该更喜欢RC4而不是AES128优于AES256而不是其他任何东西,至少根据这个基准测试.

我还建议阅读这篇精彩的文章,特别是启发性的第一个图表,显示DH对TLS握手性能的影响.

最后,确保您使用的是TLS会话缓存.这也节省了一些CPU.


小智 0

Node.js 的 https 服务器的性能与 Pound、stunnel 和 Stud 非常相似,并且这种方法没有明显的优势。

  • 那么可以说是有。假设 Node 的 HTTPS 性能相似,那么您可能会争论为什么应该在 Node.js 前面使用 Pound / Stunnel / Stud,因为它只是在系统中添加了另一个瓶颈和组件。 (3认同)