IIS 应用程序池老是自动停止,是什么原因,怎么解决?
问题
Windows Server 上的 IIS 网站,隔一阵就打不开,一看应用程序池变成了"已停止",手动启动撑不了几分钟又停。反反复复,根子在哪?
原因
应用池是被 IIS 主动停掉的,绝大多数是触发了"快速失败保护":池里的程序在 5 分钟内崩溃满 5 次(默认值),IIS 为保护服务器直接把整个池停掉。程序为什么反复崩,常见是代码里未处理的异常、内存涨穿上限、网站目录权限不够。另一类是池的"标识"(运行账户)密码过期或被改过,一启动就停。两类在事件日志里写得明明白白,先看日志再动手。
解决
第一步:打开事件查看器(Win+R 输入 eventvwr.msc)→Windows 日志→应用程序,右侧点"筛选当前日志",事件 ID 填 5002,5009,5059,来源是 WAS。最近每次停池的原因都在这里:写着 RapidFail 就是崩溃保护触发,写着标识无效就是账户问题。
第二步:IIS 管理器→应用程序池→右键出事的池→高级设置,找到"生成"分组里的"故障防护"(快速失败保护)。业务急着恢复时,先把"已启用"改为 False 让网站先活过来——注意这是止血不是治病,根因还得继续查。
第三步:查崩溃根因。回事件查看器搜 .NET Runtime 和 Application Error 的错误记录,崩溃瞬间的异常堆栈就在里面,按堆栈修代码或补依赖;同时确认网站目录的读取权限——右键网站文件夹→属性→安全,池用默认标识(ApplicationPoolIdentity)时一般已有权限。小团队不必给每个站点单建账户、调细权限,用默认标识最省心,出问题的环节也少。
第四步:如果事件显示标识无效:回到高级设置→进程模型→标识→自定义账户,重新填一遍账户和密码。服务器改过密码的,这里十有八九忘了同步。
第五步:稳定之后,把快速失败保护恢复成默认启用,再在"回收"→“固定时间间隔"之外加一个"特定时间"回收(比如每天凌晨 4:00),给长期运行的服务一个固定刷新点兜底。
预防
- 应用的异常日志接个简单告警(邮件或群机器人),崩溃第一时间知道,别等用户报障才发现池停了半天。
- 发版先在测试站点过一遍再上生产,带着未处理异常的代码别直接放出去。
这类牵扯代码层面的反复崩溃,公司没有专职运维的话,可以交给像贵州诚鑫致达科技这样的本地 IT 服务商一路跟到底。