Невозможно прогреть страницы с помощью applicationInitialization в webconfig.

У меня есть простое приложение Umbraco 7.7.2, и я размещаю его на Azure (служба приложений). Когда я перезагружаю сервер, на первый раз уходит 20-40 секунд на запрос страницы, которая действительно раздражает, особенно когда нагрузка высока, а вы уменьшаете масштаб, чтобы сократить время отклика.

Я пробовал этот параметр в моем webconnfig, но, похоже, он не работает.

<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] INFO Umbraco.Core.CoreBootManager - запуск приложения Umbraco завершен (заняло 12727 мс) 2018-02-08 15:16:54 911 [P7036/D2/T1] INFO 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>

3 ответа

Решение

Было много причин, по которым запросы не доходили до моего сайта, и благодаря Кевину и Твэмли, которые открыли мне глаза на вероятную причину, по которой я смог отследить и найти их все.

Во-первых, как сказал Кевин, 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" />

Обратите внимание, что Azure разогреет URL-адрес на http, поэтому, если вы заставляете https использовать правила перезаписи, полный сайт не будет разогреваться, только модуль перенаправления. Затем он должен завершить прогрев Umbraco после того, как Azure добавит его в балансировщик нагрузки и первый https доберется до кода umbraco. Мы выяснили это, проверив логи http при масштабировании.

Мы не могли понять, как настроить Azure на прогрев, используя https, поэтому мы разрешили Azure получить доступ к сайту по http, создав правило до того, как наша принудительная перезапись https перезапустит процесс StopProcessing, когда {REMOTE_ADDR} соответствует 127.0.0.*.

    <rule name="Allow localhost to warmup" stopProcessing="true">
      <match url="(.*)"/>
      <conditions>
        <add input="{REMOTE_ADDR}" pattern="127.0.0.*" />
      </conditions>
    </rule>

Мне нравится идея Кевина просто остановить обработку как одно из первых правил переписывания. Я заметил, что у него не было действия, но вы добавили его к своему. Может быть, попробовать его без действия? Это первое правило в файле?

Другой вариант, который мы используем, - добавить это условие к любым проблемным правилам (обратите внимание на negate).

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

Попробуйте временно очистить правила перезаписи, пока не убедитесь, что разминка работает, а затем добавьте несколько правил назад, чтобы найти и устранить проблему с перенаправлением. Принудительное использование правил типа 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()
}
Другие вопросы по тегам