一个相对简单的 Azure 应用服务(目前为 .net 4.6.2,针对 Azure SQL)已经运行了 18 个月以上。它非常稳定。我很少想到这个网站,而且几个月都没有发布更新。
我今天早上醒来发现客户发来的电子邮件,称网站报告“指定的 CGI 应用程序遇到错误,服务器终止了该进程”。我首先猜测是单击 Azure 门户上的“重新启动”应用服务。大约一分钟后,它恢复了运行,并且一直运行良好。
我进入“诊断和解决问题”->“可用性和性能”。 “请求和错误”时间线显示了网站瘫痪和恢复运行的时间。我深入研究了时间线并选择了“完整报告”。
事实上,它报道了以下内容
检测到应用程序停止事件我们分析了 3 个平台事件和 1 个用户事件。
平台(文件服务器升级) 由于文件服务器升级,您的应用程序被回收。此事件在一天内多次发生在多个实例中。这些事件会导致存储卷移动,从而可能导致应用程序重新启动。如果此重新启动事件对应用程序的可用性产生负面影响,则启用本地缓存功能可在一定程度上帮助减少对存储文件服务器的依赖。了解更多信息:检查故障排除和后续步骤中描述的本地缓存。
平台(基础设施升级) 大约在 2019 年 11 月 20 日下午 2:09:57 (UTC),在实例 xxxxxxxx 上,由于 Azure 缩放单元正在进行升级,您的应用程序已被回收。Microsoft 会定期更新底层 Azure 平台,以提高应用程序运行所在的平台基础结构的整体可靠性、性能和安全性。大多数更新都不会对 Web 应用产生任何影响。为了减少此类事件对应用程序的影响,请考虑将应用程序部署到多个区域,并使用 Azure 流量管理器跨区域分配负载。
用户(停止站点) 大约于 2019 年 11 月 20 日晚上 9:00:00(UTC),由于用户操作(例如从 Azure 门户停止网站),您的申请流程已重新启动。
我完全不知道该做什么以及如何防止这种事情再次发生。
我怀疑“本地缓存”这个建议是转移注意力的花招。我使用文件系统创建了一些临时文件,之后代码会删除这些文件。
谷歌搜索几乎没有返回任何结果。
我想我需要一些建议,以便确保这种事情不再发生。
有任何想法吗?
提前致谢。
答案1
在我的案例中WEBSITE_LOCAL_CACHE_OPTION到总是不工作。
相反,设置WEBSITE_ADD_SITENAME_BINDINGS_IN_APPHOST_CONFIG到1 才是最终有帮助的。
答案2
我们最近遇到了类似但略有不同的问题。升级后,应用程序在某些实例上会变慢或无响应。
最终,经过与 MS 进行数小时的故障排除后,我们将其缩小到某些不一致的实例,这些实例导致了应用程序洞察(Java springboot)出现问题。
getCanonicalName 在这些实例上的工作方式不同,它没有返回 IP 地址,而是返回了其他内容。我们不得不修改 catalina 设置来缓解这个问题。修复似乎在最新的 app insights SDK 中。
答案3
我也有类似的事情(在我的情况但是由于临时存储已满,WebApp 无法启动),我在这里粘贴了 Microsoft 支持工程师给我的回复,以避免将来再出现此问题。
在此实例中,存储文件服务器重新启动,并且 Web 应用程序无法启动,直到您手动重新启动,Web 应用程序卡住了,为了避免出现这类问题,您可以遵循最佳实践
始终使用 2 个实例 这些实例位于不同的升级域中,因此不会同时升级。当一个工作实例正在升级时,另一个仍然处于活动状态以处理 Web 请求。Web 应用当前配置为仅在一个实例上运行。由于您只有一个实例,因此您可能会遇到停机,因为当应用服务平台升级时,运行 Web 应用的实例也将升级。因此,您的 Web 应用进程将重新启动并将经历停机。
使用健康检查 此功能会自动从轮换中删除故障实例,从而提高可用性。此功能将每 2 分钟 ping 一次 Web 应用的所有实例上的指定健康检查路径。如果实例在 10 分钟内没有响应(5 次 ping),则该实例被确定为不健康,我们的服务将停止向其路由请求。强烈建议生产应用程序使用此功能,并尽量减少由于故障实例导致的任何潜在停机时间。注意:健康检查功能仅适用于托管在多个实例上的应用程序。有关更多信息,请查看以下文档。 https://github.com/projectkudu/kudu/wiki/Health-Check-(预览)
有关最佳实践的文章
https://azure.github.io/AppService/2020/05/15/Robust-Apps-for-the-cloud.html