我最近设置了一个基于Node.js的web套接字服务器,经过testing,它可以在一个小的EC2实例(m1.small)上每秒处理大约2000个新的连接请求。 考虑到m1.small实例的成本以及将多个实例放在支持WebSocket的代理服务器(如HAProxy)后面的能力,我们对结果非常满意。
但是,我们意识到我们还没有使用SSL进行任何testing,因此查看了许多SSL选项。 很明显,在代理服务器上终止SSL连接是理想的,因为代理服务器可以检查stream量并插入诸如X-Forward-For之类的头部,以便服务器知道请求来自哪个IP。
我看了一下Pound,stunnel和stud的SSLterminal解决scheme,所有这些解决scheme都允许443端口的连接被终止,然后通过端口80上的HAProxy传递到Web服务器。 不幸的是,我发现在c1.medium(High CPU)实例上向SSL终止代理服务器发送stream量很快就消耗了所有的CPU资源,并且每秒钟只有50次左右的请求。 我尝试过使用上面列出的全部三种解决scheme,并且他们都执行了大致相同的操作,而我仍然使用OpenSSL。 我尝试使用64位非常大的高CPU实例(c1.xlarge),发现性能只能随成本线性缩放。 所以基于EC2定价,我需要支付每秒200个SSL请求的大约600美元/米,而不是每秒2000个非SSL请求的60美元/米。 当我们开始计划每秒钟接受1,000或10,000次请求时,以前的价格变得经济上不可行。
我也尝试使用Node.js的https服务器终止SSL,性能与Pound,stunnel和stud非常相似,所以没有明显的优势。
所以我希望有人可以帮忙的是build议我如何解决这个荒谬的代价,我们必须吸收以提供SSL连接。 我听说SSL硬件加速器提供了更好的性能,因为硬件是专为SSLencryption和解密而devise的,但是由于我们目前在所有服务器上使用Amazon EC2,所以使用SSL硬件加速器不是一种select,除非我们有单独的数据以物理服务器为中心。 我只是努力想知道,如果亚马逊,谷歌,Facebook的成本如此之高,通过SSL可以提供所有stream量。 那里一定有更好的解决办法。
任何意见或想法将不胜感激。
谢谢Matt
首先,好的基准开始。 我的直觉让我想知道你使用的关键尺寸。 在我看来,你应该能够每秒终止超过200个连接 。 如果您使用的密钥大小超过1024,则应该知道性能会很快下降 。
如果您使用的是较小的密钥,并且仍然遇到问题,我会强烈关注EC2所提供的GPU产品。 在每秒一定数量的连接之后, SSLShader可能是具有成本效益的转换。
而且,调查@ ceejayoz提到的Elastic Load Balancer也是有优点的。
你可能做了错误的基准testing。 我怀疑你真的期待着每秒200个独特的新SSL访问者? 如果这些连接中的任何一个与最近访问的人重新连接,则应该使用SSLcaching – 这种事情:
server.on('newSession',function(id,data){tlsSessionStore [id] = data;});
server.on('resumeSession',function(id,cb){cb(null,tlsSessionStore [id] || null);});
而且,当然,您的基准testing需要在您的testing中呈现为处理新连接和恢复/重用会话的正确比例,因为这对您的应用程序是有意义的。
另外,如前所述,您select的密码和密钥大小也可能在速度上扮演angular色。
看起来SSL的速度取决于algorithm和期望的安全级别,我还没有对EC2实例进行基准testing,但是我希望与大家分享一些提示,以便使用预先选定的SSLalgorithm启用Google风格的ECDHE密钥交换,以避免BEAST和其他SSL错误configuration。
一些好的链接开始:(没有一个地方还有一切,我应该写一本手册,但在此之前,如果有人想提供链接和提示,我已经把这个post写成了一个社区维基)。
请看https://www.vbulletin.com/forum/showthread.php/401411-Time-to-improve-the-site-security ,了解一下为什么SSL现在不是“只是SSL”。