Загрузка без простоев / Откат в IIS


17

Я не уверен, что это правильный способ задать этот вопрос, но вот в основном то, что я хотел бы сделать:

1.) Переместите набор изменений на сайт в IIS.
2.) Не перебивайте пользователей.
3.) Быть в состоянии откатиться без особых усилий.

Итак, я знаю, что должно произойти несколько вещей:

1.) Вне сессии Proc - обработано
2.) Out of Proc cache - обработано

Итак, вопросы, которые остаются:
1.) Как мне не мешать пользователям? Если я просто загружаю файлы в мусорное ведро, приложение перезагружается и занимает более 10 секунд, чтобы вернуться в Интернет
2.) Как мне откатиться без усилий?

Я думал, что возможным решением было бы создать два сайта в IIS, один общедоступный и один частный. Загрузки идут в приват и нагреваются. После прогрева сайты меняются местами. Откат влечет за собой только обмен на приватный без загрузки.

Это звучит теоретически, но я не уверен в механике. Есть идеи?


@NickatUship: есть только 1 сервер, на котором размещен сайт? А если нет, есть ли возможность добавить секунду?
MattB

@NickatUship: также, на какой версии IIS вы работаете?
MattB

Мы могли бы решить эту проблему с помощью нашего loadbalancer - это правда. Я надеялся, что смогу что-то сделать на самом сервере - это будет работать лучше для нашего потока. Мы на IIS 7.
ChickenMilkBomb

Интересно, могли бы мы использовать глобальные правила перезаписи URL для развертывания с нулевым временем простоя? 1) Перезаписать * .domain.com на * .arbitrarysiteA.com, которое является приложением в IIS 2.) загрузить на * .arbitrarySiteB.com 3.) разогреть его up 4.) переключить переписать на * .siteB.com
ChickenMilkBomb

Ответы:


29

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

Для его настройки вам понадобятся:

Установите ARR для начала.

Настройте 3 сайта в IIS:

  • Веб-сайт 1 будет тем сайтом, к которому ваши пользователи подключаются, скажем так http://192.168.1.1/. Это также сайт ARR. Просто настройте пустой каталог, чтобы он указывал на него, и поместите его в свой пул приложений. Настройте пул приложений так, чтобы он не превышал время ожидания в соответствии с этими инструкциями .
  • Веб-сайты 2 и 3 будут сайтами, на которых фактически размещается ваш контент. Они должны быть на их собственных IP-адресах и из-за того, как работает ARR, на другом порту, чем веб-сайт 1. Допустим, они есть http://192.168.1.2:8080и http://192.168.1.3:8080. Они также должны быть в своих собственных пулах приложений и указывать на разные каталоги в файловой системе (но оба каталога обычно имеют одинаковое содержимое)

После установки ARR в диспетчере IIS появится новая категория «Фермы серверов» - щелкните правой кнопкой мыши и создайте новую ферму.

  • дать ему имя, которое имеет значение для вас
  • добавьте Webserver 2 и Webserver 3 в качестве серверов - обязательно нажмите кнопку «дополнительные настройки», откройте категорию «applicationRequestRouting» и измените httpPort на 8080 для каждого сервера
  • Завершите работу мастера - вас спросят, хотите ли вы создать правила перезаписи URL - нажмите Да
  • Теперь у вас есть ферма серверов - чтобы завершить настройку, перейдите в ферму и нажмите кнопку настройки Proxy - включите «перезаписать хост в заголовках ответов» и примените изменения.
  • В диспетчере IIS перейдите к категории сервера корневого уровня и нажмите кнопку «Перезапись URL-адреса». Будет создано правило для вашей фермы.
    • дважды щелкните правило, чтобы перейти к настройкам
    • откройте окно условий
    • добавить новое условие для {SERVER_PORT}не соответствует 8080
    • применить изменения

На данный момент у вас есть основы того, что нам нужно для выполнения вашего запроса. Если вы зайдете на сайт, http://192.168.1.1/вы получите свой веб-сайт либо с Веб-сайта 1, либо с Веб-сайта 2, но все остальные сайты будут совершенно прозрачны.

Теперь, когда вы хотите развернуть новую версию своего приложения, вы можете:

  • остановите 1 сервер вашей фермы (в инструментах фермы серверов перейдите в «Мониторинг и управление», выберите сервер и выберите «Сделать сервер недоступным изящно»)
  • разверните новую версию сайта в автономной системе
  • прогрейте сайт, который находится в автономном режиме, используя его альтернативный IP / порт
  • снова сделать сайт доступным для фермы
  • повторить процесс для другого сервера

Инструмент веб-развертывания вступает в игру, когда вы говорите о желании все это написать в сценарии. Это позволяет легко создать пакет для вашего приложения и развернуть его из командной строки. Вы также можете легко откатить этот пакет, если возникнут проблемы. ARR также сценариев с использованием DLLMicrosoft.Web.Administration .

Еще одна вещь - если вы на самом деле работаете в Windows 2008 R2 (то есть IIS 7.5), взгляните на модуль Application Warmup - это должно также облегчить вам часть прогрева.


Круто - спасибо, Мэтт. +1 даже за то, что все это сложил. Я расследую и вернусь к доске.
ChickenMilkBomb

Прекрасно .. не может быть доказательством дурака ... но работа расследует
Вивек Кумбхар

1
Это ответ для нулевого времени простоя развертывания приложений IIS. Я написал подробное руководство о том, как это сделать + автоматизировать PowerShell.
Кавун

10

MattB ударил его из воды. +1 Я отвечу более подробно, но я не собираюсь брать его очки. Я добавлю к тому, что он сказал.

У меня есть настройка, аналогичная описанной, и она прекрасно работает. ARR - это путь, даже на одном сервере.

Однако пару вещей я бы добавил.

Создайте 2 сайта, как рекомендует Мэтт. Назовите их как yoursite.com01 и yoursite.com02.

Создайте 2 правила перезаписи URL. Один для www.yourdomain.com и еще один staging.yourdomain.com. Для производства используйте {HTTP_HOST} со значением (^ www.yourdomain.com $) | (yourIP). (или любую другую привязку, которую вы предпочитаете). Для подготовки используйте {HTTP_HOST} со значением (^ staging.yourdomain.com $). Назовите правила yoursite.com и staging.yoursite.com.

Свяжите Rule = yoursite.com с site = yoursite.com01 и rule = staging.yoursite.com с site = yoursite.com02.

Настройте FTP на staging.yoursite.com.

Производственный трафик теперь идет к Rule = staging.yoursite.com и Site = yoursite.com01. Поступая в противоположность.

Вы можете развернуться в любой точке, выполнить тестирование, предварительную раскрутку, провести тестирование других людей и т. Д. Делать это в течение дня, это не имеет значения. Развертывание на одну и ту же учетную запись FTP каждый раз. Отлично работает с серверами сборки.

Затем, когда вы будете готовы к запуску, просто внесите 3 изменения: - переместите привязку FTP с yoursite.com02 на yoursite.com01 - измените правило перезаписи URL yoursite.com, чтобы он указывал на yoursite.com02 - измените постановку правила перезаписи URL. yoursite.com, чтобы указать на yoursite.com01

Теперь у вас нулевое время простоя, мгновенное переключение и возможность немедленного отката!

Единственное, что нужно учесть - это состояние сеанса вне процесса. Убедитесь, что ваш сервер состояний принимает оба идентификатора сайта, чтобы вы не теряли состояние сеанса во время обмена.

Также обратите внимание, что это только веб, а не база данных.

Для сценариев используйте редактор конфигурации. Внесите необходимые изменения и нажмите «Создать скрипт». Это даст вам код C #, appcmd или AHAdmin.

У меня это было в течение нескольких месяцев с веб-страницей для обмена экземплярами, и я никогда не оглядываюсь назад. Это делает развертывание таким освежающим по сравнению с традиционными развертываниями.


@ Скотт - спасибо за продолжение, приятно знать, что я отправил сообщение не является общим сумасшествием, так как я никогда не делал это раньше.
MattB

У меня не было большого успеха в внесении изменений в правила перезаписи URL без каких-либо простоев. Для меня большая часть времени такова: любые изменения в правилах перезаписи URL на серверах с высоким трафиком приводят к увеличению скорости процессора до 100% в течение ~ 5-10 секунд, что может привести к тайм-аутам и ощущению медлительности у пользователей.
Кавун

1
@kavun Да, в этом есть правда. При обновлении некоторых версий за последние несколько лет правила перезаписи URL на глобальном уровне начали вызывать повторную загрузку домена приложения для всех сайтов. Это не было так. Так что если у вас есть ASP.NET сайты на одном сервере, это может повлиять. Однако, если у вас есть выделенный сервер ARR только для этого, то штраф за перезапуск домена приложения минимален, и вы все равно можете использовать хорошее решение, подобное этому.
Скотт Форсайт - MVP
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.