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

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

我已经将此发布到 ServerFault,但是 Node.js 社区在那里似乎很小,所以我希望这能带来更多的曝光。

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

我阅读了大量有关 keep-alive(Upstart、Forever)、多核实用程序(Fugue、多节点、Cluster)和代理/负载平衡器(node-http-proxy、nginx、Varnish 和 Pound)的资料。但是,我不确定如何组合我可用的各种实用程序。

我已经考虑过这种设置,需要解决一些问题并获得反馈。

  1. 是 Node.js 中开发最活跃、似乎最流行的多核实用程序,因此使用它在非特权端口(例如 3000)上每个应用服务器运行 1 个节点“集群”。问题 1:应该永远用于保持集群活跃还是只是多余的?
  2. 使用 1nginx每个在端口 80 上运行的应用服务器,只需反向代理到端口 3000 上的节点。问题2:节点 http 代理即使它不能快速 gzip 或服务器静态文件,它是否更适合这项任务?
  3. 至少有 2 台如上所述的服务器,其中一台独立服务器充当这些设备之间的负载平衡器。使用监听 443 终止 HTTPS 并将 HTTP 传递给它将在上述服务器的 IP 之间进行轮询负载平衡。问题3:应该nginx可以用来同时做这两件事吗?问题4:是否应考虑使用 AWS 或 RackSpace 负载均衡器(后者不会终止 HTTPS)

一般的问题:

  1. 您是否认为有必要执行上述 (2) ?
  2. 终止 HTTPS 的最佳位置是哪里?
  3. 如果WebSockets将来需要,您将进行哪些 nginx 替换?
  4. 如何处理外部负载均衡器的单点故障?

我非常想听听大家是如何设置当前的生产环境以及他们喜欢哪种工具组合。非常感谢。

答案1

六年过去了,没有人敢于做出回应。好吧,我有一点后见之明来补充经验,所以我会提出一个。

Q1. 也许吧。如果您不介意将集群的复杂性添加到您的应用程序中,并且您小心避免任何可能在主进程中抛出的问题,那么集群工作得很好。否则,您肯定希望有一些东西来处理监督您的节点进程并在您的应用程序崩溃时重新启动它。您的操作系统可能会提供守护进程或 systemd 等替代方案。

Q2。不。在最好的情况下,在顺风顺水的日子里,node-http-proxy 几乎与 nginx 或 haproxy 一样好。不包括 SSL,haproxy 和 nginx 都好得多。很难找到一个更合适的理由。

Q3。是的,或者 haproxy。直到你需要引入 varnish。当你到了那个时候,你就不必再考虑是否应该使用 varnish。(或者你会使用 CDN)。

Q4. 您说了算。Haproxy 是我默认选择的 TLS 终止和代理工具。我还没恨自己把像负载平衡器这样重要的东西放在别人的服务器上,因为这样我就无法运行 tcpdump 或其他故障排除工具。

  1. 是的。如果您熟悉 nginx,那么可以使用它来处理 HTTPS 终止并将请求代理到您的应用服务器。如果您还不太熟悉 nginx,请考虑哈普罗西相反。有了像 haproxy 这样的名字,您会期望它在 HA 和代理方面非常出色,而且它不会令人失望。

  2. haproxy / nginx。始终如此。更好的证书管理,列表位于密码列表等。当 openssl 漏洞发布时,升级代理对您的应用的影响也较小。

  3. haproxy。(nginx 现在支持代理 websockets,所以这个问题已经过时了)。

  4. 多个站点和 BGP。将诸如 keepalived 或其他对等 TCP 故障转移机制之类的工具引入堆栈,既可能导致中断,也可能阻止中断。通常很少使用此类工具,因此当需要时,了解站点知识的人会缺乏经验。保持堆栈更简单,并依靠网络团队的技能。他们在解决问题方面经验丰富。

相关内容