【发布时间】:2012-02-22 10:56:08
【问题描述】:
我最近设置了一个基于 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 位非常大的 High 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 提供所有流量。肯定有更好的解决方案。
任何建议或想法将不胜感激。
谢谢 马特
【问题讨论】:
-
“终止”一词至少在您的上下文中令人困惑。我花了一分钟左右的时间试图理解为什么要终止 SSL 连接以及为什么不直接关闭套接字。
-
太糟糕了 elb 不做网络套接字!您是否尝试过将可用于计算成本低的密码集限制为?
-
您是否尝试过使用带有 SSL 的 Amazon elb 来处理它?我将它用于我运行的几个 SaaS。工作正常。没有 2000 conn/sec 的要求,所以不知道是否可以
-
您能否提供用于测试/基准测试服务器的命令?您的测试客户在哪里,也在亚马逊云中?您是否尝试过同时从多个客户端进行测试?
-
我不能在一条评论中回答所有问题,所以每个问题都写一条评论...我使用了“终止”,因为这是大多数负载均衡器在谈论 SSL 时使用的术语,请参阅以下链接,aws.amazon.com/elasticloadbalancing,rackspace.com/cloud/cloud_hosting_products/loadbalancers/…,www.snapt-ui.com/haproxy/snapt-haproxy-ssl-termination-released/。很抱歉,如果它令人困惑。
标签: node.js ssl openssl haproxy stunnel