如何使用多核,反向代理和SSL在云中部署Node.js以实现高可用性

我已经发布到ServerFault,但Node.js社区似乎很小,所以我希望这会带来更多的曝光。

我有一个Node.js(0.4.9)应用程序,正在研究如何最好地部署和维护它。 我想在高可用性的云(EC2或RackSpace)中运行它。 该应用程序应该运行在HTTPS上。 稍后我会担心东/西/欧全面故障切换。

我对Keep-alive(Upstart,Forever),多核实用程序(赋格,多节点,集群)和代理/负载均衡器(node-http-proxy,nginx,Varnish和Pound)做了大量的阅读, 。 但是,我不确定如何结合我可用的各种实用程序。

我有这样的设置,需要解决一些问题,并得到反馈。

  1. 集群是Node.js最活跃,最受欢迎的多核实用程序,因此可以使用它在非特权端口(比如3000)上为每个应用程序服务器运行1个节点“集群”。 问题1: 永远应该用来保持群集活着还是只是多余的?
  2. 在端口80上运行每个应用服务器使用1个nginx ,简单地反向代理到端口3000上的节点。Q2 node-http-proxy是否更适合于这个任务,即使它不能快速地gzip或服务器静态文件?
  3. 如上所述,具有最低2台服务器,独立服务器充当这些盒子上的负载平衡器。 使用Pound监听443来终止HTTPS并将HTTP传递给Varnish ,这将在上面的服务器的IP之间循环负载均衡。 Q3: nginx应该用来做两个呢? Q4:应该考虑AWS还是RackSpace负载均衡器(后者不会终止HTTPS)

一般的问题:

  1. 你有没有看到上面(2)的需要?
  2. 终止HTTPS的最佳地点在哪里?
  3. 如果将来需要WebSocket ,你会做什么nginxreplace?
  4. 你如何处理外部负载平衡器的单点故障?

我真的很想听听人们如何设置当前的生产环境以及他们喜欢的工具组合。 非常感激。

六年漫长的岁月,没有人敢于回应。 那么,我有一点事后的补充经验,所以我会提供一个。

Q1。 也许。 如果您不介意将群集的复杂性添加到您的应用程序,并且您要小心避免可能会抛出主进程的任何内容,那么群集效果很好。 否则,你当然需要一些东西来监督你的节点进程,并在应用程序崩溃时重新启动它。 您的操作系统可能会提供诸如守护进程或systemd之类的select。

Q2。 没有。最好的情况是,在风的背后,node-http-proxy几乎和nginx或haproxy一样好。 不包括haproxy和nginx都好的SSL。 build立一个更合适的案例非常困难。

Q3。 是的,还是haproxy。 直到你有需要引进清漆。 当你到达这一点时,你不会怀疑你是否应该使用清漆。 (或者你会使用CDN)。

Q4。 你的来电。 Haproxy是我TLS终止和代理的首选默认工具。 我并不讨厌自己把一些像负载平衡器那样重要的东西放在别人的服务器上,在那里我不能运行tcpdump或其他故障排除工具。

  1. 是。 如果您熟悉nginx,那么可以使用它来处理HTTPS终止,并将请求代理到您的应用程序服务器。 如果你还没有深入研究nginx,可以考虑使用haproxy 。 像haproxy这样的名字,你会期望它真的很擅长HA和代理,它并不令人失望。

  2. haproxy / nginx。 总是。 更好的证书pipe理,在cipherli.st上列出等。openssl漏洞发布时,对应用程序升级代理的影响也较小。

  3. HAProxy的。 (nginx现在支持代理websockets,所以这个问题已经过了它的到期date)。

  4. 多个站点和BGP。 引入诸如keepalived或其他点对点TCP故障转移机制的工具可能会导致中断,从而导致中断。 这种工具的使用通常是罕见的,因此当有必要时,具有现场知识的人已经不在实践中。 保持简单,取决于你的networking团队的技能。 他们很好地解决问题。