删除资源组用ARM模板重部署Azure Web App后遇404站点未找到
槽交换后Web App 404问题的排查与解决
我来帮你拆解这个问题——你在Dev环境删除资源组重建后,槽交换出现404,而不删资源组的环境正常,结合部署时的警告来看,核心是资源组重建导致的站点状态同步问题,咱们一步步来解决:
问题场景复盘
- Dev环境流程:删除资源组 → ARM模板重新部署 → Staging槽API测试正常 → 槽交换后生产槽访问
https://mywebapp.azurewebsite.net出现蓝色404页面 - QA/Prod环境无删除资源组操作,未出现此问题
- 部署时的关键警告:
- 403 Forbidden:更新
mywebapp-maintenance部署状态失败,提示"This web app is stopped" - 404 Site Not Found:更新主站点
mywebapp的部署状态失败
- 403 Forbidden:更新
可能的原因
- 资源组重建后的槽状态不同步:删除资源组会彻底清空所有槽的配置和底层资源标识,重新部署时Staging槽正常启动,但生产槽的实例初始化、DNS绑定可能还没完全完成,交换后路由指向了未就绪的实例。
- 部署过程中Web App实例未完全启动:403警告说明维护站点处于停止状态,部署时实例没正常拉起;后续的404警告则主站点在更新部署状态时还没就绪,这会影响槽交换后的站点可用性。
- 槽交换后的站点缓存未刷新:虽然你手动清了本地DNS,但Azure侧的站点路由缓存可能还没更新,尤其是资源组重建后,站点的底层IP、资源ID发生了变化,交换后路由没及时切换到新的生产槽实例。
针对性解决方案
1. 确保槽交换前所有实例完全就绪
在你的发布定义里加一步等待Web App实例运行的操作,避免在实例未启动时就执行交换:
- 用Azure CLI检查两个槽的状态:
# 检查生产槽状态 az webapp show --name mywebapp --resource-group <你的资源组名> --query state # 检查Staging槽状态 az webapp deployment slot show --name mywebapp --slot staging --resource-group <你的资源组名> --query state - 只有当两个槽返回的状态都是
Running时,再执行槽交换。 - 另外在ARM模板里开启
alwaysOn,防止实例自动停止:"properties": { "siteConfig": { "alwaysOn": true } }
2. 槽交换后强制重启生产槽
交换完成后立即重启生产槽,强制刷新实例状态和路由:
az webapp restart --name mywebapp --resource-group <你的资源组名>
这个操作能解决资源组重建后底层资源标识变化导致的路由问题,我见过不少类似场景,重启后就能正常访问。
3. 启用槽交换的预览模式
如果用的是Azure DevOps的部署任务,勾选Swap with preview(预览交换):
- 先将配置同步到生产槽并预热实例,验证没问题后再完成最终交换,避免直接交换带来的未就绪问题。
- 同时在部署任务的“Additional Deployment Options”里添加
-Restart参数,确保部署后实例完全重启。
4. 检查站点主机名配置
资源组重建后偶尔会出现主机名配置缺失的情况,用CLI检查生产槽的主机名:
az webapp show --name mywebapp --resource-group <你的资源组名> --query hostNames
如果结果里没有mywebapp.azurewebsite.net,可以手动在Azure Portal里添加,或者在ARM模板里明确配置hostNames属性:
"properties": { "hostNames": [ "mywebapp.azurewebsite.net" ] }
验证步骤
- 重新执行Dev环境部署,在槽交换前确认两个槽都处于
Running状态。 - 交换后立即重启生产槽,等待1-2分钟再访问站点。
- 如果还是有问题,打开Azure Portal里的“诊断并解决问题”工具,选择“站点已关闭”场景,让系统自动排查DNS、实例状态等问题。
内容的提问来源于stack exchange,提问作者GGirard
相关产品推荐
相关产品推荐

