7

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

我已经在我的 webconfig 中尝试过这个设置,但它似乎不起作用。

<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 ,它也花了 20 秒,因为它是第一个访问它的请求。

*PS:第一次请求后,网站非常快,每个页面加载不到 100 毫秒

更新

正如凯文所建议的那样,我已经实施了重写以停止下一个重定向。结果,我的 Umbraco 将启动,但请求仍然无法到达页面。

在我的母版页上,我添加了一行来在日志中写入一行,如果它在查询字符串中有预热并且它可以从浏览器点击页面:

if (!string.IsNullOrWhiteSpace( Request.QueryString["warmup"]))
    {
        var pageC = Model.Content;
        logger.Info(pageC.UrlAbsolute()+" "+ Request.QueryString);
    }

但是,之后我的日志中没有任何内容

2018-02-08 15:16:51,245 [P7036/D2/T1] 信息 Umbraco.Core.CoreBootManager - Umbraco 应用程序启动完成(耗时 12727 毫秒) 2018-02-08 15:16:54,911 [P7036/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>
4

3 回答 3

5

请注意,azure 会在 http 上预热 URL,因此如果您使用重写规则强制使用 https,则整个站点不会预热,只有重定向模块会。然后它需要在 azure 将 Umbraco 添加到负载均衡器之后完成预热,并且第一个 https 进入 umbraco 代码。我们通过在向外扩展时检查 http 日志发现了这一点。

我们无法弄清楚如何使用 https 告诉 azure 进行预热,因此我们允许 Azure 在 {REMOTE_ADDR} 匹配 127.0.0.* 时强制 https 重写以停止处理之前通过制定规则来访问 http 上的站点。

    <rule name="Allow localhost to warmup" stopProcessing="true">
      <match url="(.*)"/>
      <conditions>
        <add input="{REMOTE_ADDR}" pattern="127.0.0.*" />
      </conditions>
    </rule>
于 2018-02-07T02:50:52.070 回答
3

请求无法到达我的站点的原因有很多,感谢KevinTwamley,他们让我看到了可能的原因,我可以追踪并找到所有这些请求。

首先,正如 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>

我没想到我的请求会到达此重定向,因为它是在我的重写规则结束时,因此它应该在No redirect on warmup request时停止,但它没有,所以我添加了另一个条件: <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-09T10:11:33.590 回答
2

我喜欢 Kevin 的想法,即停止处理作为第一个重写规则之一。我注意到他没有采取任何行动,但您在您的行动中添加了一项。也许试试他的无动作?它是文件中的第一条规则吗?

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

<add input="{REMOTE_ADDR}" pattern="127\.0\.0\.1" negate="true"/>

尝试暂时清除您的重写规则,直到您确信您的热身正在工作,然后一次添加一些规则以查找并修复问题重定向。Force SSL 和 Trailing Slash 类型的规则肯定会导致问题。

此外,hostName 很容易给您带来麻烦。它应该与您的生产环境完美匹配。它不使用 DNS 来解析它,它只是与本地站点对话并将其作为 HOST 标头传递。

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

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()
}
于 2018-02-09T02:01:30.680 回答