本地IIS站点如何不停止运行即可实现文件更新与自动部署?
本地IIS站点无停机自动更新方案
首先你当前的更新流程是可行的,遇到的The process cannot access file, because it already used报错属于正常现象:IIS的工作进程(w3wp.exe/ dotnet.exe)会在站点运行期间锁定bin目录下的dll文件,直接覆盖必然触发占用报错,不需要停止整个IIS服务即可解决。
原有方案的改造步骤(无需更换方案)
按照以下流程执行更新即可实现无感知文件覆盖:
- 第一步:将从GitHub拉取的更新文件先下载到站点根目录之外的临时文件夹,不要直接写入站点目录
- 第二步:执行PowerShell命令回收对应站点的应用程序池:
IIS默认开启重叠回收机制,执行该命令时会先启动新的工作进程处理所有新请求,旧工作进程处理完存量请求后自动退出,全程不会中断站点服务,旧进程退出后会自动释放所有dll文件锁。Restart-WebAppPool -Name "你的站点对应的应用程序池名称" - 第三步:等待2~3秒后,将临时文件夹内的更新文件覆盖到站点对应的目录下
- 第四步:校验文件覆盖完整性即完成更新
如果需要确保极短时间内的请求不返回错误,可以在替换文件前先在站点根目录创建app_offline.htm静态文件,IIS检测到该文件存在时会把所有站点请求返回该文件内容(可以自定义为“站点更新中,请稍后刷新”的提示),同时立即释放文件锁,替换完成后删除该文件即可自动恢复站点服务,中断时长最多不超过1秒,普通用户完全无感知。
更可控的推送更新替代方案
如果需要从线上Windows服务器主动推送更新到本地IIS站点,可以在原有逻辑基础上做如下调整:
- 线上服务端准备好更新包后,给本地部署的站点发送更新通知请求
- 本地站点接收到更新通知后,校验请求来源合法性,再按照上述更新流程执行下载、回收、覆盖操作即可
- 提前给站点应用程序池的运行身份授予站点目录的读写权限、以及执行应用程序池回收命令的权限即可跑通全流程
内容的提问来源于stack exchange,提问作者Ahsan farooq
相关产品推荐
相关产品推荐

