IIS URL Rewrite – Перевести приложение в режим обслуживания

Вопрос или проблема

У меня есть требование уметь переключать IIS приложение (приложение на python flask) в режим обслуживания; команда, частью которой я являюсь, решила добавить файл maintenance.html в корень директории приложения, если потребуется перевести приложение в режим обслуживания.

Если это важно, у меня уже есть переключатель режима обслуживания на уровне python/приложения, я также хочу реализовать его на уровне веб-сервера.

Ниже приведено правило URL-Rewrite, где я проверяю существование файла maintenance.html в корне директории приложения; если он существует, возвращается ответ с кодом 503 и настраивается страница ошибки 503, указывая на файл maintenance.html:

<system.webServer>
  <!-- ... -->

  <rewrite>
      <rules>
        <!-- Режим обслуживания - включается, если в корне директории есть страница maintenance.html. -->
        <!-- Если истина, возвращается код 503 и используется страница ошибки, определенная в httpErrors. -->
        <rule name="MaintenanceMode" enabled="true" stopProcessing="true">
          <match url=".*" />
          <conditions logicalGrouping="MatchAny">
            <add input="{APPL_PHYSICAL_PATH}maintenance.html" matchType="IsFile" />
          </conditions>
          <action type="CustomResponse"
            statusCode="503"
            statusReason="Maintenance Mode"
            statusDescription="Это ответ, указывающий, что IIS обслуживает страницу обслуживания (503) напрямую, обходя приложение."
          />
        </rule>
      </rules>
  </rewrite>
  <httpErrors>
    <error statusCode="503" path="maintenance.html" responseMode="File" />
  </httpErrors>
</system.webServer>

Это в основном работает…

Когда я помещаю maintenance.html в директорию приложения, я тестирую, посетив домашнюю страницу приложения; кажется, что возвращаются только ответы 503 для файлов *.css и *.js, но не для самой домашней страницы. В результате я вижу домашнюю страницу с нарушенным стилем. Приложение в конечном итоге начинает показывать страницу обслуживания спустя пару минут (?). Я заметил, что я могу изменить web.config (например, добавив комментарий) и страница обслуживания появляется почти сразу.

Я пытался добавить следующее:

<system.web>
  <httpRuntime waitChangeNotification="1" maxWaitChangeNotification="1" />
</system.web>

Чтобы проверить, решило ли это проблему, но безуспешно. Насколько я понимаю, IIS обновит приложение только если изменены определенные типы файлов, такие как web.config. Html файлы и подобные считаются статическими файлами. Я предпочитаю не перезапускать пул приложений или вручную изменять файл, чтобы обновить приложение.

Если есть какие-либо другие предложения, буду очень признателен. Спасибо

Ответ или решение

Введение:

Для IT-специалистов, которые работают с приложениями на IIS, необходимость перехода в режим обслуживания является важной задачей. Данный режим позволяет завершить технические работы или обновления, минимизируя неудобства для пользователей. В текущем случае, требуется настроить механизм активации режима обслуживания для приложения, созданного на Python Flask, учитывая существующую серверную среду IIS и необходимость выполнения определенных действий при нахождении файла maintenance.html в корне приложения.

Основная задача:

Для реализации этого механизма вы предлагаете использовать правило URL Rewrite в IIS, которое будет проверять наличие файла maintenance.html и, в зависимости от его наличия, возвращать статус 503 (Service Unavailable). Однако в текущей настройке возникают проблемы: страница приложения и статические файлы, такие как .css и .js, обрабатываются иначе, что приводит к нарушениям стилей и задержкам в отображении страницы обслуживания.

Анализ и решение:

Проблема

  1. Непоследовательное применение правила:
    При переходе в режим обслуживания правило применимо не ко всем элементам страницы. Это связано с механизмом кеширования и обработки запросов в IIS, особенно для статических файлов.

  2. Задержки в применении изменений:
    Изменения в конфигурации IIS, такие как добавление файла maintenance.html, не сразу влияют на обработку запросов, требуя дополнительных манипуляций с web.config для моментального применения.

Решение

1. Обновление правил Rewrite

Убедитесь, что правило применяется к URL с более детально выраженным соответствием для включения всех частей приложения:

<rewrite>
    <rules>
        <rule name="MaintenanceMode" enabled="true" stopProcessing="true">
            <match url="^.*$" />
            <conditions logicalGrouping="MatchAny">
                <add input="{APPL_PHYSICAL_PATH}maintenance.html" matchType="IsFile" />
            </conditions>
            <action type="CustomResponse"
                statusCode="503"
                statusReason="Maintenance Mode"
                statusDescription="This is a response to indicate that IIS is serving the maintenance (503) page directly and bypassing the application."
            />
        </rule>
    </rules>
</rewrite>

Использование регулярного выражения ^.*$ может помочь в точном соответствии всех запросов.

2. Управление кешированием

Измените параметры кеширования для более быстрой активации изменений. Используйте модуль outputCaching для уменьшения кеширования страниц:

<system.webServer>
    <caching enabled="true" enableKernelCacheForVaryByStar="false">
        <profiles>
            <add extension=".html" policy="DisableCache" />
        </profiles>
    </caching>
</system.webServer>

3. Настройка Application Pool

Убедитесь, что настройки Application Pool учитывают изменения в файлах. Попробуйте изменить режим recycle на основе файла.

<recycling>
    <periodicRestart>
        <privateMemory>0</privateMemory> <!-- Установите значение, которое лучше всего подходит для вашего приложения -->
    </periodicRestart>
</recycling>

Заключение:

Этот комплексный подход должен помочь вам более эффективно активировать режим обслуживания для вашего приложения на IIS, минимизируя время реакции и обеспечивая пользователя корректным опытом взаимодействия. Вносимые изменения позволят добиться более быстрой и предсказуемой работы приложения в условиях технического обслуживания, что способствует поддержанию высокого уровня удовлетворенности пользователей.

Оцените материал
Добавить комментарий

Капча загружается...