如何在RapidFailProtection触发后自动重启IIS应用程序池?
IIS应用池触发快速失败保护后自动重启方案
针对网络故障导致应用池触发快速失败保护后停滞、无法自动恢复的问题,以下是几种标准解决方案:
方案1:修改IIS应用池内置失败策略
通过调整应用池进程模型配置,让触发快速失败保护后自动重启应用池(注:若应用持续崩溃会反复重启,适合故障能快速自愈的场景):
- 打开IIS管理器,定位目标应用池 → 右键选择「高级设置」
- 在「进程模型」区域,将「失败时操作」从默认的「终止」改为「重启」
- 也可通过
appcmd命令批量配置(结合原有快速失败阈值):
appcmd set apppool "你的应用池名称" /failure.action:Restart /failure.rapidFailProtectionMaxCrashes:5 /failure.rapidFailProtectionInterval:00:05:00
方案2:Windows任务计划程序实现延迟重启
这是更灵活的方案,可设置触发快速失败后延迟指定时间(比如2小时)再重启,避免短时间内反复重启:
- 创建PowerShell脚本(如
RestartAppPool.ps1):
Import-Module WebAdministration $targetPool = "你的应用池名称" if ((Get-WebAppPoolState -Name $targetPool).Value -eq "Stopped") { Start-WebAppPool -Name $targetPool }
- 打开「任务计划程序」创建新任务:
- 触发器:选择「事件日志」,日志选「系统」,来源选
WAS,事件ID填5011(该事件对应应用池因快速失败保护停止) - 操作:启动程序,选择
powershell.exe,参数填-ExecutionPolicy Bypass -File "C:\脚本存放路径\RestartAppPool.ps1" - 条件:设置「延迟任务时间」为2小时(按需调整)
- 设置:勾选「允许任务在按需运行时执行」,可选配置任务失败后的重试规则
- 触发器:选择「事件日志」,日志选「系统」,来源选
方案3:自定义指数退避重启(进阶)
若需要实现指数退避逻辑(如第一次10分钟重启,第二次30分钟,最高不超过2小时),可修改PowerShell脚本加入次数统计和延迟计算:
Import-Module WebAdministration $targetPool = "你的应用池名称" $logFile = "C:\Logs\AppPoolRestartLog.txt" $currentState = (Get-WebAppPoolState -Name $targetPool).Value if ($currentState -eq "Stopped") { # 读取历史重启次数 $restartCount = if (Test-Path $logFile) { [int](Get-Content $logFile -Tail 1) } else { 0 } # 计算延迟时间,指数退避且上限120分钟 $delayMinutes = [Math]::Min(10 * [Math]::Pow(2, $restartCount), 120) Start-Sleep -Minutes $delayMinutes Start-WebAppPool -Name $targetPool # 更新重启计数日志 ($restartCount + 1) | Out-File $logFile -Append }
将该脚本配置到任务计划程序,触发逻辑同方案2即可。
注意事项
- 确保执行脚本的账户拥有操作IIS应用池的权限(建议使用本地管理员账户)
- 可在「事件查看器」→「系统日志」中验证
WAS来源的5011事件是否正常触发
内容的提问来源于stack exchange,提问作者Brondahl
相关产品推荐
相关产品推荐

