我有一个简单的Umbraco 7.7.2应用程序,我在Azure (应用服务)上托管它。当我重新启动服务器时,第一次请求页面需要20-40秒,特别是当负载很高时,特别是在扩展以减少响应时间时,这真的很烦人。
我已经在我的网络连接中尝试过这个设置,但是它似乎不起作用。
<system.webServer>
<applicationInitialization>
<add initializationPage="/page1/?warmup=1" hostName="mydomain.com" />
<add initializationPage="/page1/page2/?warmup=1" hostName="mydomain.com" />
</applicationInitialization>
</system.webServer>我可能尝试错误的方式,但我所做的是重新启动服务器,我已经离开了2-3分钟,没有请求任何页面。
我检查了我的Umbraco日志,应用程序甚至没有启动。然后我请求了主页,花了40秒才上来。
然后,我尝试了mydomain.com/page1 1,它也花了20秒,因为它是第一个访问它的请求。
*P.S:在第一次请求之后,站点非常快,每个页面的加载时间不到100 ms。
更新
正如Kevin所建议的那样,我已经实现了一个重写以停止下一个重定向。因此,我的Umbraco将启动,但请求仍然没有到达页面。
在母版页上,我添加了一行,以便在日志中写入一行,如果它在查询字符串中进行了热身,并且工作正常--页面是从浏览器中删除的:
if (!string.IsNullOrWhiteSpace( Request.QueryString["warmup"]))
{
var pageC = Model.Content;
logger.Info(pageC.UrlAbsolute()+" "+ Request.QueryString);
}然而,我的日志中没有任何内容。
2018-02-08 15:16:51,245 P 7036/d2/t1信息Umbraco.Core.CoreBootManager - Umbraco应用程序启动完成(采取12727 15) 2018-02-08 15:16:54,911 P 7036/d2/t1信息MyNamespace.Web.CustomStartup -基本配置完成!
以下是我根据凯文的回答补充的供词:
<rule name="No redirect on warmup request (request from localhost with warmup user agent)" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{REMOTE_ADDR}" pattern="127.0.0.*" />
</conditions>
<action type="Rewrite" url="{URL}" />
</rule>此外,我还在Microsoft上找到了另一个类似的配置:
<rule name="No redirect on warmup request (request from localhost with warmup user agent)" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{HTTP_HOST}" pattern="localhost" />
<add input="{HTTP_USER_AGENT}" pattern="Initialization" />
</conditions>
<action type="Rewrite" url="{URL}" />
</rule>发布于 2018-02-09 10:11:33
这些请求没有到达我的网站有很多原因,感谢,Kevin,和Twamley,他们打开了我的眼睛,发现了可能的原因,我可以追踪并找到所有的原因。
首先,正如Kevin所说,HTTPS是我已经解决的问题之一,如下所示:
<rule name="No redirect on warmup request (request from localhost with warmup user agent)" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{HTTP_HOST}" pattern="localhost" />
<add input="{HTTP_USER_AGENT}" pattern="Initialization" />
</conditions>
<action type="Rewrite" url="{URL}" />
</rule>然后我可以看到Umbraco启动了,但是请求没有到达我的页面。
<rule name="Redirect rquests to www.example.com" stopProcessing="true" enabled="true">
<match url="(.*)" />
<conditions >
<add input="{HTTP_HOST}" pattern="^example\.com$" />
</conditions>
<action type="Redirect" url="https://www.example.com/{R:0}" />
</rule>我没想到我的请求会达到这个重定向,因为它是在重写规则的末尾,因此它应该在停止,在预热请求上没有重定向,但是它没有,所以我给它添加了另一个条件:<add input="{HTTP_USER_AGENT}" pattern="Initialization" negate="true" />
<rule name="Redirect rquests to www.example.com" stopProcessing="true" enabled="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTP_HOST}" pattern="^example\.com$" />
<add input="{HTTP_USER_AGENT}" pattern="Initialization" negate="true" />
</conditions>
<action type="Redirect" url="https://www.example.com/{R:0}" />
</rule>而且,我的设置中有ipSecurity,因为它是我的测试环境,我不希望它对公众开放。结果,如果我不打开127.0.0.1,初始化就无法访问我的站点……
<security>
<ipSecurity allowUnlisted="false">
<add ipAddress="127.0.0.1" allowed="true" />
<add ipAddress="x.x.x.x" allowed="true" />发布于 2018-02-07 02:50:52
请注意,azure会在http上温暖URL,所以如果您强制https使用重写规则,整个站点将不会升温,只有重定向模块会。然后,在azure将其添加到负载均衡器中之后,它需要完成Umbraco的热身,第一个https通过umbraco代码。我们通过在扩展时检查http日志来发现这一点。
我们不知道如何告诉azure使用https进行热身,所以当{ stopProcessing }匹配127.0.0.*时,我们允许Azure通过在强制https重写到stopProcessing之前访问http上的站点。
<rule name="Allow localhost to warmup" stopProcessing="true">
<match url="(.*)"/>
<conditions>
<add input="{REMOTE_ADDR}" pattern="127.0.0.*" />
</conditions>
</rule>发布于 2018-02-09 02:01:30
我喜欢Kevin把停止处理作为第一批重写规则之一的想法。我注意到他没有行动,但你在你的行动中增加了一个。也许可以试试他的动作?这是文件中的第一条规则吗?
我们使用的另一个选项是将此条件添加到任何问题规则中(注意negate)。
<add input="{REMOTE_ADDR}" pattern="127\.0\.0\.1" negate="true"/>尝试暂时清除您的重写规则,直到您确信您的热身正在工作,然后每次添加几条规则,以找到并修复问题重定向。强制SSL和跟踪Slash类型规则肯定会导致问题。
而且,hostName很容易给你带来麻烦。这应该是一个完美的匹配您的生产环境。它不使用DNS来解析它,它只是与本地站点对话,并将其作为主机头传递进来。
我的热身列表中没有任何查询字符串。也许你应该试着放下那些。您并不需要它们,因为您可以将日志记录代码更改为:
if (Request.IsLocal && Request.UserAgent == "IIS Application Initialization Warmup") {
// log it
}记录它们是一个很好的主意,因为热身请求不会出现在标准的IIS日志中。我让服务器在热身的开始和结束时通过点击使用该if语句的第一个和最后一个特殊条目来给我发送邮件。Azure的一些有用的细节:
new {
WEBSITE_HOSTNAME = System.Environment.GetEnvironmentVariable("WEBSITE_HOSTNAME"),
WEBSITE_INSTANCE_ID = System.Environment.GetEnvironmentVariable("WEBSITE_INSTANCE_ID"),
WEBSITE_SITE_NAME = System.Environment.GetEnvironmentVariable("WEBSITE_SITE_NAME"),
COMPUTERNAME = System.Environment.GetEnvironmentVariable("COMPUTERNAME"),
USER_AGENT = Request.UserAgent,
URL = Request.Url,
WARM_UP_TIME = (DateTime.UtcNow - _start).ToString()
}https://stackoverflow.com/questions/48621207
复制相似问题