IIS 6.1搭建永不回收停止的ASP.NET网站(含Hangfire后台任务)
针对IIS 6.1 ASP.NET网站永不回收/停止的解决方案
我之前在维护IIS 6.1上的ASP.NET站点时也碰到过类似的硬需求,刚好可以分享一下可行的方案:
一、先明确:IIS 6.1没有绝对的"永不停止"内置开关,但可以最大化减少回收
虽然没有一键实现的内置功能,但通过关闭所有触发回收的配置项,能把回收概率降到极低:
1. 彻底关闭应用程序池的回收规则
打开IIS管理器,找到你的目标应用程序池 → 右键属性 → 切换到回收标签页:
- 取消勾选所有回收触发项:包括按时间、请求数、虚拟内存、私有内存、特定时间回收的选项
- 确保没有任何规则会触发IIS主动回收进程
2. 禁用闲置超时,避免因无请求被回收
切换到性能标签页:
- 取消勾选"闲置超时(分钟)",或者把数值设为
0(代表永不超时),这样IIS不会因为网站长时间没收到请求就杀掉进程
3. 关闭快速失败保护,避免异常导致回收
切换到健康标签页:
- 取消勾选"启用快速失败保护",防止网站短时间内出现几次错误就被IIS强制回收
4. 进程模型配置优化
切换到进程模型标签页:
- 把"空闲超时(分钟)"设为
0 - "最大工作进程数"设为
1,避免多进程模式下的回收切换问题 - 确保"身份"使用的账户有足够权限,不会因权限问题导致进程意外终止
二、你的定时任务方案的优化建议
即使做了上面的配置,极端情况(比如系统资源耗尽、未处理异常崩溃)还是可能导致进程停止,你的定时任务方案是很好的补充,这里给几个优化点:
- 不要直接调用函数,发起真实HTTP请求
用PowerShell或者wget工具定时访问网站的一个简单存活检测页面(比如专门写个KeepAlive.aspx,只返回200状态码),这样更符合IIS的活跃判定逻辑。示例PowerShell命令:Invoke-WebRequest -Uri "http://你的站点域名/KeepAlive.aspx" -UseBasicParsing - 设置合理的定时频率
建议每5分钟执行一次(比IIS默认的20分钟闲置超时短),确保IIS始终认为网站处于活跃状态。如果担心资源占用,也可以设为15分钟一次,但必须小于你设置的闲置超时时间。 - 增加失败处理逻辑
在定时任务里加简单的判断:如果请求返回非200状态码,尝试用命令行重启应用程序池(需要定时任务账户有IIS管理权限):appcmd recycle apppool /apppool.name:"你的应用程序池名称"
三、ASP.NET代码层面的额外优化
在网站的web.config里添加配置,进一步减少ASP.NET自身触发的应用域重启:
<system.web> <processModel enable="true" timeout="Infinite" idleTimeout="Infinite" requestLimit="Infinite" memoryLimit="10000" /> </system.web>
这里把进程运行时间、闲置时间、请求数都设为无限,内存限制设为一个极大值,避免ASP.NET因自身规则触发回收。另外,要注意不要修改web.config、bin目录文件、App_Code代码,这些操作会直接触发应用域重启。
总结
IIS 6.1没有能保证100%永不停止的内置功能,但通过上述IIS配置+定时任务的组合,再配合ASP.NET层面的优化,已经能最大限度接近"一秒都不能下线"的需求,我之前用这套方案维护的站点,连续几个月都没有出现意外下线的情况。
内容的提问来源于stack exchange,提问作者Asaf Epelbaum
相关产品推荐
相关产品推荐

