DevOps中实现IIS物理目录自动切换以避免API部署停机的问询
零停机部署.NET Core Web API:双目录+IIS自动切换的DevOps实现
当然可以完全通过编程/自动化脚本实现,根本不用手动修改IIS物理路径!这种方案本质上是轻量版的蓝绿部署,非常适配你的场景,下面一步步给你讲怎么在DevOps管道里落地:
核心思路
准备两个完全独立的部署目录(比如Api_blue和Api_green),IIS站点始终指向其中一个作为"活跃"目录。每次部署时:
- 将新代码发布到非活跃的备用目录
- 通过脚本修改IIS站点的物理路径,切换到新部署的目录
- IIS会自动启动新目录下的API进程,旧进程会被优雅回收,全程无停机
具体实现步骤
1. 提前配置IIS和目录结构
- 在服务器上创建两个目录,比如
C:\inetpub\wwwroot\Api_blue和C:\inetpub\wwwroot\Api_green - 新建IIS站点,初始指向其中一个目录(比如
Api_blue),配置好对应应用池(确保是.NET Core托管模式)
2. 在DevOps管道中添加自动化切换脚本
不管你用Azure DevOps、GitHub Actions还是其他DevOps工具,都可以通过PowerShell脚本来修改IIS配置。下面是一个可直接复用的脚本示例:
# 配置参数,根据你的实际情况修改 $siteName = "YourApiSiteName" $bluePath = "C:\inetpub\wwwroot\Api_blue" $greenPath = "C:\inetpub\wwwroot\Api_green" # 获取当前站点的物理路径 $currentActivePath = (Get-WebSite -Name $siteName).physicalPath # 确定本次要部署的目标目录(备用目录) $targetDeployPath = if ($currentActivePath -eq $bluePath) { $greenPath } else { $bluePath } # --- 这里插入你的部署步骤 --- # 比如用FTP/Web Deploy将新代码发布到$targetDeployPath # 确保部署完成后,目标目录的文件是完整可用的 # 切换IIS站点到新部署的目录 Set-WebSite -Name $siteName -PhysicalPath $targetDeployPath # 可选:如果需要强制刷新应用池(一般切换路径后IIS会自动触发重启,这步可省略) # Restart-WebAppPool -Name (Get-WebSite -Name $siteName).applicationPool
3. 集成到DevOps发布管道
- Azure DevOps:添加一个"PowerShell"任务,选择"内联脚本",把上面的代码粘贴进去,确保代理服务器有管理员权限修改IIS
- GitHub Actions:使用
windows-latestrunner,添加run步骤执行PowerShell脚本,同样要确保runner有足够权限
关键注意事项
- 权限:DevOps代理/runner必须有修改IIS配置的权限(比如以本地系统账户运行,或者添加管理员权限)
- 一致性:两个目录的结构要完全一致,避免代码中有硬编码的路径依赖
- 回滚:如果新部署出问题,只需要再运行一次脚本,切换回原来的目录即可,非常方便
- 日志:可以在脚本中添加日志输出(比如
Write-Host "Switched to target path: $targetDeployPath"),方便排查部署问题
这种方案比手动修改高效太多,而且能保证每次部署的一致性,完全符合DevOps自动化的理念。
内容的提问来源于stack exchange,提问作者OJs
相关产品推荐
相关产品推荐

