首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在webconfig中使用applicationInitialization预热页面

无法在webconfig中使用applicationInitialization预热页面
EN

Stack Overflow用户
提问于 2018-02-05 11:06:36
回答 3查看 3.5K关注 0票数 7

我有一个简单的Umbraco 7.7.2应用程序,我在Azure (应用服务)上托管它。当我重新启动服务器时,第一次请求页面需要20-40秒,特别是当负载很高时,特别是在扩展以减少响应时间时,这真的很烦人。

我已经在我的网络连接中尝试过这个设置,但是它似乎不起作用。

代码语言:javascript
复制
<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将启动,但请求仍然没有到达页面。

在母版页上,我添加了一行,以便在日志中写入一行,如果它在查询字符串中进行了热身,并且工作正常--页面是从浏览器中删除的:

代码语言:javascript
复制
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 -基本配置完成!

以下是我根据凯文的回答补充的供词:

代码语言:javascript
复制
 <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上找到了另一个类似的配置:

代码语言:javascript
复制
   <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>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-02-09 10:11:33

这些请求没有到达我的网站有很多原因,感谢,Kevin,Twamley,他们打开了我的眼睛,发现了可能的原因,我可以追踪并找到所有的原因。

首先,正如Kevin所说,HTTPS是我已经解决的问题之一,如下所示:

代码语言:javascript
复制
 <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启动了,但是请求没有到达我的页面。

代码语言:javascript
复制
  <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" />

代码语言:javascript
复制
  <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,初始化就无法访问我的站点……

代码语言:javascript
复制
 <security>
  <ipSecurity allowUnlisted="false">
    <add ipAddress="127.0.0.1" allowed="true" />
    <add ipAddress="x.x.x.x" allowed="true" />
票数 3
EN

Stack Overflow用户

发布于 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上的站点。

代码语言:javascript
复制
    <rule name="Allow localhost to warmup" stopProcessing="true">
      <match url="(.*)"/>
      <conditions>
        <add input="{REMOTE_ADDR}" pattern="127.0.0.*" />
      </conditions>
    </rule>
票数 5
EN

Stack Overflow用户

发布于 2018-02-09 02:01:30

我喜欢Kevin把停止处理作为第一批重写规则之一的想法。我注意到他没有行动,但你在你的行动中增加了一个。也许可以试试他的动作?这是文件中的第一条规则吗?

我们使用的另一个选项是将此条件添加到任何问题规则中(注意negate)。

代码语言:javascript
复制
<add input="{REMOTE_ADDR}" pattern="127\.0\.0\.1" negate="true"/>

尝试暂时清除您的重写规则,直到您确信您的热身正在工作,然后每次添加几条规则,以找到并修复问题重定向。强制SSL和跟踪Slash类型规则肯定会导致问题。

而且,hostName很容易给你带来麻烦。这应该是一个完美的匹配您的生产环境。它不使用DNS来解析它,它只是与本地站点对话,并将其作为主机头传递进来。

我的热身列表中没有任何查询字符串。也许你应该试着放下那些。您并不需要它们,因为您可以将日志记录代码更改为:

代码语言:javascript
复制
if (Request.IsLocal && Request.UserAgent == "IIS Application Initialization Warmup") {
    // log it
}

记录它们是一个很好的主意,因为热身请求不会出现在标准的IIS日志中。我让服务器在热身的开始和结束时通过点击使用该if语句的第一个和最后一个特殊条目来给我发送邮件。Azure的一些有用的细节:

代码语言:javascript
复制
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()
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48621207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档