ASP.NET Core应用程序的多主机部署

6

我很困惑,因为我没有看到任何关于如何使用HA和多主机部署托管ASP.NET Core/.NET Core应用程序的博客或说明。所有的例子都是:

1) One NGINX reverse-proxy, one Kestrel
2) One IIS reverse-proxy, one Kestrel

两个组件都在同一主机上。在真实的生产环境中,您可能会使用LB服务发现、多个前端、多个后端等。但是对于这种情况,没有任何说明。因此,我的问题针对多主机环境:

  • 我是在一个IIS/NGINX上部署作为LB/反向代理,然后将请求重定向到运行在许多不同VM:s上的Kestrel,即各种不同的IP:s吗?
  • 还是在一个主机上运行NGINX/F5进行负载平衡,然后将http流量路由到运行IIS+Kestrel或仅Kestrel的各个VM:s?在这种设置中,是否需要IIS,因为NGINX充当LB?
  • 如果我在IIS或NGINX上运行反向代理,它们能否保持不同VM:s上的Kestrels活动状态,还是每个Kestrel都需要一个IIS/NGINX来保持其活动状态?即Kestrel进程必须与反向代理位于同一主机上?

非常欢迎所有答案,提前感谢您! :)


嗨。我对你的问题没有完整的答案,但我可以评论一下,在生产环境中,你不会仅使用Kestrel来处理VM上的请求,Kestrel需要一个额外的反向代理层,比如IIS,它将能够处理应用程序池(在崩溃时重新启动Kestrel,回收...),处理客户端证书,处理Kerberos等等。因此,总是使用Kestrel + 反向代理。好文章:https://weblog.west-wind.com/posts/2016/Jun/06/Publishing-and-Running-ASPNET-Core-Applications-with-IIS#RunningIISasaDevelopmentServer-no - Daboul
1
是的,这个问题很清楚地在各处都有说明。问题是,如果我有很多主机怎么办 :) ,这在生产中总是会发生的情况。 - user1340582
你好,关于这个问题你有什么解决方案吗?我也遇到了同样的情况。如果可以的话,请分享一下你的经验。谢谢。 - Deowan Faruque Ahamad
2个回答

2
我在边缘运行NGINX作为负载均衡器和SSL终止器,并使用IIS + Kestrel服务MVC的多个服务器。这对我们来说效果很好。你可能不需要它,但我发现NGINX比IIS更加复杂和强大。显然,F5或其他东西也可以工作。以前,我还使用AWS ELB负载均衡器一段时间,也能正常工作,只是没有太多的可配置性。所以这取决于你的需求。
如前所述,每个运行kestrel的盒子都需要安装IIS来管理进程。你可以用其他方式做到这一点,但使用IIS是最简单的。

但是仅仅为了管理进程而运行IIS+Kestrel还是有点不必要,我觉得Asp.net Core+Kestrel的一个很好的比较对象是Spring Boot(嵌入Tomcat)。使用Spring Boot时,你可以像使用Asp.net Core一样运行它。对于Spring Boot,我永远不会在每个主机上运行例如NGINX这样的东西。我只需要一个NGINX作为负载均衡器,将请求路由到多个Spring Boot实例即可。同样地,我会将NGIX/IIS路由到多个Kestrels(而没有IIS)。 - user1340582
不,我不会说这是不必要的,你必须使用某些东西来启动Kestrel进程并监视它,并在出现问题时重新启动它。当然,IIS对此来说有点大材小用,但正如我所说,.net core模块已经为此设置好了一切,因此很容易,而且我不会担心性能,除非你有非常高和不寻常的需求。自己编写解决方案以管理kestrel,然后直接从NGINX访问它没有任何问题,但为什么要费这个劲呢? - Tom

1
我有一个设置,使用一个VM(IIS作为负载均衡器)+几个VM(IIS + Kestrel)。对于我的使用来说,它运行良好,但我很好奇其他人是否有不同的建议。然后这取决于你在做什么,如果你使用加密,机器密钥需要在VM之间共享,你可能还需要在VM之间共享会话(https://www.exceptionnotfound.net/finding-and-using-asp-net-session-in-core-1-0/),将东西存储在数据库中...

我有一个建议,也许可以在Kestrel所在的主机上留出IIS?因为您在那之前有一个IIS并且您可能会在负载平衡器上终止SSL,所以它不会面向互联网。 - user1340582
使用SQL Server或Redis共享会话在asp.net core中是没有问题的,这些都是开箱即用的。 - user1340582
我保持IIS一直运行,因为这是我第一条评论的重点。假设您只在一台机器上运行Kestrel,那么您将获得一个名为MyAspDotNetCoreApplication.exe的进程运行,但是如果它发生崩溃,此VM上的IIS将能够生成一个新实例,而作为负载均衡器运行在另一个VM上的IIS不会这样做(除非您找到一种方法来做到这一点,我对此非常感兴趣)。 - Daboul
你使用IIS ARR进行负载均衡吗?你喜欢它吗?我没有经验,但我需要一个LB来将流量路由到托管Kestrel(+可能是IIS)的多个VM。IIS ARR会检查节点是否存活并停止路由到它吗?IIS ARR是否允许您配置路由策略,例如NGINX所做的那样,例如路由到最不繁忙的主机,轮询等?再次感谢! - user1340582
没问题,我有点喜欢IIS和ASP.Net Core一起工作的方式。享受吧。 - Daboul
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接