当前位置: 首页 > 面试题库 >

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

王宏扬
2023-03-14
问题内容

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

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

我已经阅读了很多有关保持活动(Upstart,Forever),多核实用程序(Fugue,多节点,群集)和代理/负载平衡器(node-http-
proxy,nginx,Varnish和Pound)的文章。 。但是,我不确定如何组合可用的各种实用程序。

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

  1. 群集 是Node.js上开发最活跃,看似最流行的多核实用程序,因此可以使用它在非特权端口(例如3000)上为每个应用程序服务器运行1个节点“群集”。 Q1: 应该 永远 用于保持群集的活动状态还是仅仅是冗余?
  2. 使用1个 nginx的 每端口80上运行,只是反向代理到节点上的端口3000的应用程序服务器 Q2:节点HTTP代理 更适合,即使它的gzip或服务器静态文件很快没有这个任务吗?
  3. 如上所述,最少要有2台服务器,并且一台独立的服务器充当这些机箱中的负载平衡器。使用 Pound 侦听443终止HTTPS并将HTTP传递给 Varnish ,这将在上述服务器的IP上循环负载平衡。 Q3: 应该同时使用 nginx 吗? Q4: 应该考虑使用AWS或RackSpace负载均衡器(后者不会终止HTTPS)

一般的问题:

  1. 您是否完全需要上面的(2)?
  2. 终止HTTPS的最佳位置在哪里?
  3. 如果将来需要 WebSocket ,那么您将替换哪些nginx?

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


问题答案:

自从我问这个问题已经好几个月了,没有太多的答案。Samyak Bhuta和nponeccop都有很好的建议,但我想讨论一下我对问题的答案。

这是我目前确定的生产系统的内容,但始终会不断进行改进。我希望它能在类似情况下为任何人提供帮助。

  1. 使用“群集”可以生成您想要在多核虚拟机或物理机上处理传入请求的子进程。这绑定到单个端口,使维护更加容易。我的经验法则是n-1个集群工作者。您不需要永久使用此功能,因为集群会重生会死掉的工作进程。为了即使在集群父级也具有弹性,请确保使用Upstart脚本(或等效项)来守护Node.js应用程序,并使用Monit(或等效项)监视集群父级的PID,并在死时重新生成它。您可以尝试使用Upstart的重生功能,但是我更喜欢让Monit监视事情,因此,与其分担责任,不如让Monit最好也处理重生。

  2. 每个在端口80上运行的应用服务器使用1个nginx,只需在(1)中绑定到的任何端口上对代理进行反向代理即可。可以使用node-http-proxy,但是nginx在提供静态文件方面更成熟,功能更丰富且速度更快。运行nginx lean(不要记录,不要gzip小文件)以最大程度地减少开销。

  3. 如上所述,至少在2个可用区中具有至少2台服务器,如果在AWS中,则使用ELB,该ELB终止端口443上的HTTPS / SSL,并通过HTTP端口80与node.js应用服务器通信。ELB很简单,并且,如果您愿意,可以使其更易于自动缩放。您可以运行多个nginx,共享一个IP或由您的DNS提供商自行平衡,但我现在发现这种方法已经过时了。届时,您将在每个应用程序服务器上删除nginx实例。

我不需要WebSockets,因此nginx仍然很适合,当WebSockets出现时,我将重新讨论这个问题。

欢迎反馈。



 类似资料:
  • 目标 1、不使用命令行,由Node.js调用webpack执行打包操作; 2、开启webpack-dev-server代理,并实现数据反向代理。 知识点 1、webpack-dev-server代理proxy:webpack-dev-server可以配置代理; 2、mockjs:生成随机数据; 3、Node.js spawn:Node.js子进程; 4、express:Node.js非常好用的应用

  • 我目前正在尝试为客户端界面-服务器交互构建一个API。我已经决定使用ASP.NET核心作为API,Nginx作为托管平台(在Ubuntu 18.04上)。由于ASP.NET使用Kestrel,我们设置了一个反向代理,将请求从Nginx转发到Kestrel——也就是托管API的服务器。我们在NGINX服务器上设置了SSL,但是它没有在Kestrel服务器上设置。 简单地说,我不知道如何在 Kestr

  • 问题内容: 我尝试在我的node.js应用中实现ssl,但失败了。这是我的app.js https://gist.github.com/eldyvoon/7a1df560fd9d13da74d090e28f7ee801 在开发中(本地主机),出现“您的连接不是私有的”错误。我以为是Chrome的问题。 所以我尝试将其部署到我的ubuntu服务器上,我为我的node.js应用程序使用了Nginx代理

  • 主要问题:我们在库伯内特斯上运行Kafka Streams(Java)应用程序,以在我们的Kafka集群(运行Confluent Community Edition v7.0/Kafka v3.0)中消耗、处理和生成实时数据。我们如何以限制消耗记录停机时间的方式部署我们的应用程序?我们最初的目标是每个任务停机时间约为2秒。 我们的目标是持续部署生产环境的更改,但部署的破坏性太大,导致应用程序中的记

  • 介绍如何搭建云联壹云高可用环境。 高可用部署方案介绍 云联壹云 平台高可用至少需要3个及3个以上的节点组成高可用环境;高可用环境将会自动部署MINIO作为共享存储,MINIO默认挂载在其中一个节点,当该节点宕机后,将会自动挂载到其他的节点上。 3节点版 使用3个节点部署高可用环境时,需要在2个节点上部署数据库高可用以及 云联壹云 平台高可用, 该方案只能保证部署高可用的2个节点中的其中一个宕机而不

  • 如果您想使用 Nginx 作为 Gitea 的反向代理服务,您可以参照以下 nginx.conf 配置中 server 的 http 部分: server { listen 80; server_name git.example.com; location / { proxy_pass http://localhost:3000; } } 使用