如何使用多核,反向代理和SSL在云中部署Node.js以实现高可用性
我已经发布到ServerFault,但Node.js社区似乎很小,所以我希望这会带来更多的曝光。
我有一个Node.js(0.4.9)应用程序,正在研究如何最好地部署和维护它。 我想在高可用性的云(EC2或RackSpace)中运行它。 该应用程序应该运行在HTTPS上。 稍后我会担心东/西/欧全面故障切换。
我对Keep-alive(Upstart,Forever),多核实用程序(赋格,多节点,集群)和代理/负载均衡器(node-http-proxy,nginx,Varnish和Pound)做了大量的阅读, 。 但是,我不确定如何结合我可用的各种实用程序。
我有这样的设置,需要解决一些问题,并得到反馈。
- 集群是Node.js最活跃,最受欢迎的多核实用程序,因此可以使用它在非特权端口(比如3000)上为每个应用程序服务器运行1个节点“集群”。 问题1: 永远应该用来保持群集还是只是多余?
- 在端口80上运行每个应用服务器使用1个nginx ,简单地反向代理到端口3000上的节点。Q2 : node-http-proxy是否更适合于这个任务,即使它不能快速地gzip或服务器静态文件?
- 如上所述,具有最低2台服务器,独立服务器充当这些盒子上的负载平衡器。 使用Pound监听443来终止HTTPS并将HTTP传递给Varnish ,这将在上面的服务器的IP之间循环负载均衡。 Q3: nginx应该用来做两个呢? Q4:应该考虑AWS还是RackSpace负载均衡器(后者不会终止HTTPS)
一般的问题:
- 你有没有看到上面(2)的需要?
- 终止HTTPS的最佳地点在哪里?
- 如果将来需要WebSocket ,你会做什么nginxreplace?
我真的很想听听人们如何设置当前的生产环境以及他们喜欢的工具组合。 非常感激。
我问了这个问题已经有好几个月了,而且没有太多答案。 Samyak Bhuta和nponeccop都有很好的build议,但是我想讨论一下我的问题。
这是我在生产系统的这一点上已经解决的问题,但是总会有进一步的改进。 我希望它可以帮助任何人在类似的情况。
-
使用群集产生尽可能多的subprocess,以处理多核虚拟或物理机器上的传入请求。 这绑定到一个单一的端口,使维护更容易。 我的经验法则是n – 1集群工人。 你不需要Forever,因为Cluster重新生成了死亡的工作进程。 即使在集群父级别也要有弹性,请确保使用Upstart脚本(或等效)来守护Node.js应用程序,并使用Monit(或等价物)来监视Cluster父节点的PID,并在其死亡时重新生成。 你可以尝试使用Upstart的重生function,但是我更喜欢让Monit观察事物,所以不要分担责任,我觉得最好让Monit来处理重生。
-
在端口80上运行每个应用程序服务器使用1个nginx,只需在(1)中绑定的任何端口上反向代理到您的群集。 可以使用node-http-proxy,但是nginx在服务静态文件时更加成熟,function更强大,速度更快。 运行nginx精益(不要logging,不要gzip小文件),以尽量减less开销。
-
在至less2个可用区域中至less配备2台如上所述的服务器,如果在AWS中,则使用ELB在端口443上终止HTTPS / SSL,并在HTTP端口80上与node.js应用程序服务器进行通信。 ELB很简单,如果你愿意,可以使自动缩放更容易一些。 你可以运行多个nginx来共享一个IP,或者通过你的DNS提供商来平衡自己的循环,但是现在我发现这个过度杀毒。 此时,您将删除每个应用程序服务器上的nginx实例。
我不需要WebSocket,所以nginx仍然适用,当WebSocket进入图片时,我会重新讨论这个问题。
欢迎反馈。
你不应该打扰快速提供静态文件。 如果你的负载很小 – 节点静态文件服务器将会这样做。 如果你的负载很大 – 最好使用CDN(Akamai,Limelight,CoralCDN)。
而不是永远,你可以使用monit。
而不是nginx,你可以使用HAProxy。 已知使用websockets很好。 考虑代理闪存套接字,因为它们是一个很好的解决方法,直到websocket支持无处不在(请参阅socket.io)。
HAProxy有一些支持HTTPS负载平衡,但不是终止。 您可以尝试使用stunnel进行HTTPS终止,但是我认为这太慢了。
循环加载(或其他统计)平衡在实践中运行良好,所以在大多数情况下,不需要知道其他服务器的负载。
考虑使用ZeroMQ或RabbitMQ来进行节点之间的通信。
这是一个很好的线程! 感谢所有贡献有用信息的人。
过去几个月,我一直在处理同样的问题,为我们的创业设立基础设施。
正如人们之前提到的,我们需要一个支持多核的networking套接字+虚拟主机的节点环境
我们最终创build了本地集群模块和http-proxy之间的混合,并将其称为Drone–当然,它是开源的:
https://github.com/makesites/drone
我们还把它作为一个AMI与Monit和Nginx一起发布
https://aws.amazon.com/amis/drone-server
我发现这个线程正在研究如何为Drone-tnx添加SSL支持来推荐ELB,但是我不会依赖专有的解决scheme来实现如此重要的function。
相反,我扩展了默认代理来处理所有的SSL请求。 当SSL请求被转换为普通的http时,configuration是最小的 – 但是我认为当你在端口之间传输stream量的时候是可取的。
随时查看,让我知道如果它适合您的需求。 欢迎所有反馈。
我已经看到AWS负载平衡器负载均衡和终止+ http-node-proxy为反向代理,如果你想运行多个服务的每箱+ cluster.js多核支持和进程级别故障切换做得非常好。
cluster.js上的forever.js可能是您想要在故障转移方面非常谨慎的好select,但这并不是必需的。