最近,我在我们的一个 Azure 项目中实施了应用程序初始化,以最大限度地减少每个站点预热所需的时间。
我基本上已经完全按照这篇博文中概述的步骤实现了。
在全新部署中,它适用于我在 IIS 中的所有 10 个站点。但是,问题是,当我尝试升级该部署时,每个站点的前 25 个请求左右出现 500 个错误。
现在,这并不理想,因为不是在部署后对每个站点进行一次热身,而是在超过 500 次之前我必须加载每个站点大约 25 次。但它们并没有就此停止,它们似乎偶尔会发生。
如果我在部署后重新映像机器,则可以解决问题。但是,以停机为代价,这不是一个选择。
有任何想法吗?
我有以下内容:
ServiceDefinition.csdef 中的启动任务来开启应用程序初始化模块:
<Task commandLine="enableApplicationInitializationIIS.cmd" executionContext="elevated"></Task>
然后在该任务中我有:
PKGMGR.EXE /iu:IIS-ApplicationInit
在 ServiceConfiguration.csfg 我设置了最新的osFamily
:
<ServiceConfiguration serviceName="Foo" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="3" osVersion="*" schemaVersion="2012-10.1.8">
然后在 Web 角色中,我有以下打开所有应用程序初始化所需的设置:
public class WebRole : RoleEntryPoint
{
public override bool OnStart()
{
using (var serverManager = new ServerManager())
{
foreach (var site in serverManager.Sites)
{
foreach (var application in site.Applications)
{
application["preloadEnabled"] = true;
}
site.ServerAutoStart = true;
}
serverManager.ApplicationPoolDefaults.ProcessModel.IdleTimeout = new TimeSpan(00, 00, 00);
serverManager.ApplicationPoolDefaults.Recycling.PeriodicRestart.Time = new TimeSpan(00, 00, 00);
serverManager.ApplicationPoolDefaults["startMode"] = "AlwaysRunning";
foreach (var appPool in serverManager.ApplicationPools)
{
appPool["startMode"] = "AlwaysRunning";
}
serverManager.CommitChanges();
}
return true;
}
}
最后,我的每个网站都有以下内容:
<system.webServer>
<applicationInitialization skipManagedModules="true">
<add initializationPage="/" />
</applicationInitialization>
</system.webServer>
不知道skipManagedModules
是什么?