用于 Asp.Net Core 的 Kestrel 网络服务器 - 是不是在一段时间后回收/重新加载
Posted
技术标签:
【中文标题】用于 Asp.Net Core 的 Kestrel 网络服务器 - 是不是在一段时间后回收/重新加载【英文标题】:Kestrel webserver for Asp.Net Core - does it recycle / reload after some time用于 Asp.Net Core 的 Kestrel 网络服务器 - 是否在一段时间后回收/重新加载 【发布时间】:2017-03-29 15:14:55 【问题描述】:简单的菜鸟问题:-)
我即将使用托管在 digitalocean 的 droplet 中的小型 .NET 核心应用程序主机投入生产。我一直使用 IIS 托管网站,但我想迁移到 linux 发行版并使用 nginx 作为反向代理。
我的问题正如标题所说:-) kestrel 是否每个人都需要像 IIS 那样回收“应用程序池”?如果不是,这是否意味着从 Kestrel 加载的应用程序在关闭之前一直在线?
最好的问候 延斯
【问题讨论】:
建议:Kestrel 很烂,不要在没有 IIS 或其他进程管理层的情况下使用它来保持它的活力 【参考方案1】:根据观看所有http://live.asp.net Community Standup 会议的信息,Kestrel 不会像 IIS 那样回收自身。
原因是 Kestrel 如果停止,目前无法重新启动。这就是为什么将它放在某种反向代理(如 IIS 或 nginx)之后很重要的众多原因之一。这种进程生命周期管理功能目前必须来自 Kestrel 之外的软件层。如果 Kestrel 因软件 bug 或其他原因死机,并且没有反向代理或其他进程重新启动它,它不会自行重新启动,网站将处于停机状态。
有关更多信息,本文讨论发布到 Linux 生产环境,并包含一个示例 nginx 系统服务文件,该文件具有 Restart=always
https://docs.microsoft.com/en-us/aspnet/core/publishing/linuxproduction
【讨论】:
很遗憾没有内置的解决方案,而且我还没有找到适用于 Linux 的事实上的标准替代方案(应该由 Microsoft 记录)。主要区别在于 IIS 应用程序池会预防性地重新启动,以清理任何累积的内存等。如果在 Linux 上没有为 Kestrel 实现类似的机制,那么它可能会累积内存碎片,直到它减速到爬行(因为使用交换文件而不是 RAM)并最终崩溃。因此,在 Linux 上,我们需要额外的实用程序(cron 作业?)来执行预定的重启。但是,Microsoft 文档忽略了这一点。 @JustAMartin - 这是一个有趣的观点。我原以为nginx会有一个进程回收的设置,这样你就可以定期回收kestral。但我做了一些谷歌搜索,并没有看到这样的设置。如果这是您需要的功能,您可能应该在 SO 上将其作为 nginx 问题发布。也许对 nginx 有更多经验的人可以阐明解决方案。 恐怕不会有任何开箱即用的 Nginx 解决方案,因为它只是充当虚拟代理。 Nginx 将数据从/到网络套接字或 Unix 管道路由,并且不在乎它是 Kestrel 还是另一端的其他任何东西;与与 .NET Core 托管机制紧密集成的 IIS 不同。所以,我想,在 Linux 上,我们完全处于“自己动手”领域。以上是关于用于 Asp.Net Core 的 Kestrel 网络服务器 - 是不是在一段时间后回收/重新加载的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core Web服务器 Kestrel和Http.sys 特性详解
为 HTTPS 配置 ASP.NET Core 2.0 Kestrel