默认情况下,IIS会为每个网站分配一个应用程序池,也有默认的回收策略。为什么我们要去修改IIS的应用程序池回收策略呢?因为如果某网站的应用程序池被回收后,下次有人要访问这个网站,IIS要新开一个进程来为该网站建立应用程序池,那么很不幸的,这个人需要等待较长的时间才能打开网站(只有第一个人会被影响)。这对访客来说自然是不友好的,所以必要时我们可以修改IIS的回收策略。
IIS的默认设置是根据时间来进行回收。此外我们也可以通过限制内存使用量来回收,不过不常用。本文要修改的也是时间策略。
打开IIS的应用程序池的默认设置:
修改默认设置可以将更改批量应用到所有站点中,这样比较方便。
1.间隔性回收:
固定时间间隔,默认是1740分钟(29小时)。也就是每个应用程序池间隔性的每过29小时就回收一次。但是这个设置并不好用,这样的回收可能在白天发生(通常来说就是访客很多的时候),我们要修改成0,即禁用此策略。
不过这个我修改成0的时候报错,所以我只能在每个网站的应用程序池设置里单独禁用。但在某些情况下应该可以直接修改成0的,这样就不需要为每个网站单独设置了。至于原因我不太清除,看自己情况吧。
设置单个网站的步骤如下:
在网站的应用程序池上右键,选择“正在回收”:
进入回收设置:
把固定时间间隔取消选中,然后一路Enter保存设置。
2.特定时间回收(默认未启用):
这个比较有用,可以取代间隔性回收。我们可以随意设定时间,比如设置成每天凌晨2点进行回收:
隔天可以到系统日志里看是否生效:
3.闲置超时回收:
如果某个进程闲置超过一定时间,则进行回收,默认是20分钟。如果内存比较充足,建议加大些,我改成了1440(24小时)。
以上3种策略是互不影响的,按自己需要设置即可。
其实上面的设置主要是避开了在访客多的时间回收,但是每天第一个打开网站的用户还是需要等待一段时间。这个问题是可以解决的,我们可以设置计划任务,比如在每天凌晨2点半,访问一次网站,这样就启动了应用程序池,访客就不需要再等待了。
思路有两种,一种是使用cmd命令,一种是使用PowerShell脚本。cmd命令需要启动IE来访问网站,但是操作起来比较简单。PowerShell脚本可以不启动IE直接访问网站(其实还是调用了IE的功能),但是设置比较麻烦。
1.使用cmd命令:
将下面的命令保存为批处理文件(*.bat),之后添加到计划任务里,设置每天某个事件执行即可。
explorer http://www.exmp.com/ ping -n 100 127.0.0.1>nul taskkill /f /im iexplore.exe
效果是用IE浏览器打开网站,经过100秒后关闭IE。简单粗暴又有效。
tips:计划任务默认是只有用户登录时执行,我们可以改成下面的不管是否登陆都执行。不过这样的话,执行时我们看不到对应的界面和进程信息,因为任务执行时是运行在系统用户里的。
至于PowerShell …… 很容易踩坑。但是很不幸的,我就是先踩进了的坑,最后改回用cmd了。
2.PowerShell脚本方法:
将如下命令保存成PowerShell脚本(*.ps1文件),之后使用计划任务执行即可:
invoke-webrequest http://www.exmp.com/;
至于怎么在计划任务里执行PowerShell脚本(还要先开启PowerShell脚本的执行权限),可以参见此文章:
《Windows 任务计划程序定时执行 powershell 脚本》
注意:
1.此命令需要PowerShell 3.0及以上;
2.先在PowerShell里执行命令看一下是否正常,有时候会出现windows安全警告什么的,需要降低IE设置里的的安全等级。
实践中遇到了坑爹情况:我在测试用PowerShell访问本网站的时候,弹出了是否允许存储cookie的警告框(直接使用IE访问不会弹出):
根据网上的资料,取消这个警告需要我们把IE的安全等级设置为“低”:
但是即使我关闭了IE的增强安全配置,还是没办法调到“低”,因为最低的那一项就是“中”,还是有警告框,这就很无奈了。
那怎么办呢,那就不用PowerShell了,改为使用cmd。
我本将心向明月,奈何明月照……IE。
linux好用...