Azure App Service 横向扩展(Scale Out)后实例运行不同应用版本问题
问题原因
该问题属于Windows平台Azure App Service横向扩展场景下的常见部署同步问题,并非你遗漏了基础配置,核心诱因有两个:
- 启用了站点本地缓存:Azure App Service开启本地缓存后,每个实例会将共享存储中的站点文件缓存到本地实例磁盘,默认部署仅更新共享存储文件,运行中的实例不会主动拉取更新后的缓存文件,导致版本不一致
- MSDeploy默认部署规则限制:默认部署未启用进程停止规则,运行中的Dotnet进程会锁定部分程序集文件,导致部署仅能更新无文件锁的实例
解决方案
按优先级依次配置即可解决:
- 调整GitHub Action部署参数,添加MSDeploy额外规则
修改你的部署步骤配置,新增additional-arguments参数强制停止站点进程、避免文件锁:
- name: Azure WebApp uses: azure/webapps-deploy@v2.2.3 with: publish-profile: ${{ secrets.AZUREWEBAPPPUBLISHPROFILE }} app-name: esferas-app slot-name: staging package: ./artifacts/web additional-arguments: '-enableRule:AppOffline'
如果你需要保留站点内用户上传的静态文件等非部署生成的内容,可以在参数后追加-enableRule:DoNotDeleteRule避免部署时删除额外文件。
2. 配置App Service强制全实例同步
进入Azure门户对应App Service的配置 > 应用设置页面,添加如下配置项:
- 键:
WEBSITE_RESTART_ALL_INSTANCES_ON_DEPLOYMENT,值:1
该配置会触发每次部署完成后自动重启所有实例,拉取共享存储中的最新代码文件。如果你开启了本地缓存提升性能,确认配置WEBSITE_LOCAL_CACHE_OPTION的值为Always即可,无需关闭本地缓存。
- 槽位交换补充配置(可选)
如果你后续需要将staging槽的代码交换到生产槽,额外添加应用设置WEBSITE_SWAP_WARMUP_PING_PATH,值设为你的健康检查接口路径(如/),交换过程中会自动预热所有实例,确保上线时所有实例运行版本一致。 - 临时应急修复
如果部署后临时出现版本不一致,直接在Azure门户App Service概览页点击重启,即可强制所有实例同步最新代码。
内容的提问来源于stack exchange,提问作者MattGWagner
相关产品推荐
相关产品推荐

