Asp.Net Core 的 Kestrel Web 服务器 - 是否会在一段时间后进行重启/重新加载?

13
简单的新手问题 :-)
我即将使用托管在digitalocean的droplet中的小型.NET核心应用程序主机进入生产。我一直使用IIS托管网站,但我想转移到Linux发行版并使用nginx作为反向代理。
我的问题如标题所述 :-) Kestrel是否需要像IIS一样定期重启“应用程序池”?如果不是,那么这是否意味着从Kestrel加载的应用程序在线直到关闭?
最好的问候 Jens

1
建议:Kestrel 很差,不要在没有 IIS 或其他进程管理层的情况下使用它以保持其运行。 - A X
1个回答

11

根据观看所有http://live.asp.net社区集会时从这里和那里获取的一些信息,我认为Kestrel不能像IIS那样自动回收。

原因是Kestrel目前没有办法在停止后重启自己。这是为什么将其置于类似于IIS或nginx的反向代理之后非常重要的众多原因之一。这种进程生命周期管理功能目前必须来自Kestrel外部的软件层。如果Kestrel由于软件错误或其他原因而死亡,并且没有反向代理或其他进程来重新启动它,则不会自行重新启动,并且网站将保持停机状态。

有关更多信息,请参阅此文章,其中介绍了“发布到Linux生产环境”,并包括具有 Restart=always的示例nginx系统服务文件。https://learn.microsoft.com/en-us/aspnet/core/publishing/linuxproduction


1
很遗憾,对于Linux而言,没有内置的解决方案,我也还没有找到一个事实上的标准替代品(应该由Microsoft记录)。主要区别在于,IIS应用程序池会预防性地重启,以清理任何累积的内存等。如果Kestrel在Linux上没有实现类似的机制,那么它可能会积累内存碎片,直到因使用交换文件而变得缓慢,并最终崩溃。因此,在Linux上,我们需要额外的实用程序(cron job?)来进行定期重启。然而,Microsoft的文档忽略了这一点。 - JustAMartin
@JustAMartin - 这是一个有趣的观点。我本以为nginx会有一个进程回收的设置,这样你就可以定期回收kestrel了。但我做了一些谷歌搜索,没有看到这样的设置。如果这是你需要的功能,你应该在SO上发布一个nginx问题。也许有更多经验的nginx用户可以提供解决方案。 - RonC
很抱歉,对于Nginx来说,不会有任何开箱即用的解决方案,因为它只是一个虚拟代理。Nginx将数据从/到网络套接字或Unix管道路由,并不关心另一端是Kestrel还是其他什么;这与IIS紧密集成了.NET Core托管机制不同。因此,我想,在Linux上我们完全处于“自己动手”的领域。 - JustAMartin

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