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提供所有流量,而其成本如此之高.那里必须有更好的解决方案.
任何建议或想法将不胜感激.
谢谢马特
我不太了解不同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 非常相似,并且这种方法没有明显的优势。
| 归档时间: |
|
| 查看次数: |
5228 次 |
| 最近记录: |