ASP.NET Core 应用程序的多主机部署
Posted
技术标签:
【中文标题】ASP.NET Core 应用程序的多主机部署【英文标题】:Multi-host deployment of ASP.NET Core applications 【发布时间】:2017-06-19 14:16:08 【问题描述】:我很困惑,因为我没有看到任何关于如何使用 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 的各种 VM:s,还是只运行 Kestrel?由于 NGINX 充当 LB,此设置中是否需要 IIS? 如果我将 IIS 或 NGINX 作为反向代理运行,它们能否使 Kestrel 在不同的 VM:s 上保持活动状态,或者每个 Kestrel 是否只需要一个 IIS/NGINX 才能保持活动状态? IE。 Kestrel 进程必须与反向代理位于同一主机上?非常欢迎所有答案,并提前非常感谢! :)
【问题讨论】:
嗨。我对您的问题没有完整的答案,但我可以评论这样一个事实,即在生产中,您不会仅通过 Kestrel 侦听请求来处理 VM 上的请求,Kestrel 需要额外的反向代理层,例如 IIS这将能够处理应用程序池(在崩溃的情况下重新启动 Kestrel,回收......),处理客户端证书,处理 kerberos ......所以总是 Kestrel + 反向代理。好文章:weblog.west-wind.com/posts/2016/Jun/06/… 是的,这在任何地方都非常清楚地说明了。问题是,如果我有很多主机怎么办 :) 就像生产中的情况一样。 【参考方案1】:我在边缘运行 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 作为 LB,将请求路由到许多 Spring Boot 实例。同样,我会将 NGIX/IIS 路由到多个 Kestrel(并且没有 IIS)。 不,我不会说它没有必要,你必须使用一些东西来启动 Kestrel 进程并监控它,如果出现问题则重新启动它。当然 IIS 是一个很大的矫枉过正,但就像我说的那样,它的所有设置都使用 .net 核心模块,所以它很容易,我不会担心性能,除非你有非常高和不寻常的需求。滚动您自己的解决方案来管理红隼,然后直接从 NGINX 中访问它并没有错,但是为什么要麻烦呢?【参考方案2】:我有一个使用(IIS 作为 LB)的 VM + 几个使用(IIS + Kestrel)的 VM 的设置。它对我的使用效果很好,但我很想知道其他人是否有不同的建议。那么这取决于你在做什么,如果你使用加密,机器密钥需要在虚拟机之间共享,你可能还需要在虚拟机之间共享会话(https://www.exceptionnotfound.net/finding-and-using-asp-net-session-in-core-1-0/),将东西存储在数据库中......
【讨论】:
我会提出的一个建议是,也许可以忽略 Kestrel 所在主机上的 IIS?它不是面向互联网的,因为在此之前您有一个 IIS,并且您可能在 LB 处终止 SSL? ...使用 SQL Server 或 Redis 共享会话不是问题,asp.net 核心支持开箱即用。 我一直保持 IIS,因为这是我第一个评论的重点,假设你刚刚在一台机器上运行 Kestrel,你会得到一个进程 MyAspDotNetCoreApplication.exe 正在运行,但是如果其中发生崩溃,该 VM 上的 IIS 将能够生成一个新实例,而在另一个 VM 上作为负载平衡器运行的 IIS 不会这样做(除非你能找到一种方法来做到这一点,我会对此非常感兴趣)。 我明白你的意思,但 IIS 很可能在那里受到了糟糕的性能影响。可能也在LB阶段。你有做过 NGINX 和 IIS 作为 LB 的比较吗? NGINX 非常擅长,但我不确定 IIS LB 功能。有比较的地方吗?至少 NGINX 能够在最大重试次数后停止将消息路由到丢弃的节点。 嗨。我没有也对有关此事的任何反馈感兴趣。我只能说,性能足以满足我的需要,据我了解,设置 IIS 应用程序池无需绑定 .Net 框架,仅充当反向代理,似乎非常有效,Kestrel 在本身超级快,我最终得到了一个易于部署且响应迅速的设置。但是您可能比我更关心性能问题,而且我还没有时间将所有内容与其他 LB 进行精确基准测试,但如果可以的话,这是我想要的。以上是关于ASP.NET Core 应用程序的多主机部署的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core Web 应用程序开发期间部署到IIS自定义主机域名并附加到进程调试