Репутація українського ІТ. Пройти опитування Асоціації IT Ukraine
×Закрыть

ASP.NET 5: публикуем приложение на Windows Server

Всем привет. В прошлой статье я рассказывал о том, как опубликовать ASP.NET 5 приложение под Linux. Давайте сегодня поговорим про Windows.

Для публикации приложения нам понадобится Visual Studio 2015 любой редакции. На всякий случай — вот ссылка на бесплатную редакцию Visual Studio Community.

Важно:
1. После установки Visual Studio нужно обновить Microsoft ASP.NET and Web Tools 2015 до beta 8 (уже есть RC1, но проект, который мы создавали в этой статье, был под beta8).
2. Запустить «Developer Command Prompt for VS2015» и выполнить 2 команды: dnvm setup и dnvm upgrade.

Проект мы создавали в этой статье, его и будем публиковать.

Стоит сказать, что процедура публикации приложения на Windows гораздо приятнее, чем на Linux. По крайнем мере, Visual Studio при публикации собирает все необходимое для запуска веб приложения на не подготовленном сервере. Но обо всем по порядку.

Подготовка сервера

Первое, что нужно сделать, это поднять сервер.

Как и в прошлой статье, я буду разворачивать виртуалку в Azure, но в этот раз под Windows Server 2016 Technical Preview 4 (уж очень хотелось попробовать новую OS).

На портале Azure в меню создания виртуальной машины из галереи выбираем образ «Windows Server 2016 Technical Preview 4» и жмем далее:

Задаем имя машины, пользователя, пароль (будет использоваться для доступа по RDP) и размер (минимально рекомендуемая конфигурация D1, но работает и на A0, правда подтормаживает; я развернул D2, чтобы побыстрее все настроить):

Далее выбираем регион «West Europe» и добавляем необходимые нам порты: 80, 5000:

На следующем шаге оставляем всё как есть. Жмем «Finish»:

После того, как виртуалка создалась, на портале в меню внизу появится кнопка «Connect»:

После нажатия на нее браузер предложит скачать RDP файлик. Скачиваем, открываем, вводим логин ([имя машины]\[логин]) и пароль, нажимаем OK:

Есть у Windows Server TP4 одна бага (причем я так и не понял, это только в Azure или не только). Дело в том, что пользователь, под которым мы законнектились, не имеет возможности открывать браузер, приложения на сервере и т.п. Лечится это просто: нужно создать еще одного админа и зайти с него. Для этого идем в «Computer Management» и добавляем нового пользователя:

Вот окно настроек нового пользователя. Для теста сделайте так, как у меня:

После того, как пользователь создан, добавляем его в группу администраторов:

Перелогиниваемся под новым пользователем.

Настраеваем Firewall

Теперь нам нужно создать настройки Firewall для того, чтобы пустить трафик по портам, которые слушают наши веб сервера. Идем в настройки Firewall -> Advanced:

Создаем новое входящее правило:

Тип правила — «Port»:

Протокол «TCP», порты 80, 5000:

Действие — «Allow the connection»:

Ну и задаем имя нашему правилу:

На этом конфигурация Firewall завершена.

Устанавливаем IIS

Теперь добавляем IIS. По большому счету, его добавлять не обязательно, если мы не планируем проксировать запросы на Kestrel (мы можем Kestrel запустить напрямую на порт 80). Но мы сделаем так, как описано в гайде по разворачиванию ASP.NET 5 под Windows. IIS устанавливается просто, через Server Manager. Идем в «Add roles and features»:

Проходим до «Server Roles» и добавляем Web Server (IIS):

Далее, в разделе «Role Services» убеждаемся, что у вас проставлены галочки так, как у меня:

Теперь нам нужно поставить «HTTP Platform Handler» (x64, x86):

Зачем это нужно? Наш реквест пайплайн будет выглядеть так: запрос попадает в IIS по 80-му порту, который без какой-либо обработки через HTTP Platform Handler будет отдавать его на порт 5000, на котором будет сидеть Kestrel. При этом IIS сам будет запускать Kestrel.

Собственно, для того, чтобы не было никакой обработки IIS-ом, нужно дотюнить настройки веб сервера и Application Pool. Идем в настройки веб сервера:

Открываем «Configuration Editor»:

Идем в секцию «system.webServer/handlers» и справа жмем «Unlock Section»:

Далее, идем в настройки «Application Pools» -> «DefaultAppPool» -> «Basic Settings»:

И в разделе «.NET CLR version» указываем «No Managed Code»:

Рестартуем веб сервер:

На этом подготовка сервера завершена.

Публикация на сервер

Переходим в Visual Studio, отрываем проект, который мы создавали в позапрошлой статье.

Проверяем «Project.json». У меня он выглядит вот так:

{
  "webroot": "wwwroot",
  "version": "1.0.0-*",
  "dependencies": {
    "Microsoft.AspNet.IISPlatformHandler": "1.0.0-beta8",
    "Microsoft.AspNet.Server.Kestrel": "1.0.0-beta8",
    "Microsoft.AspNet.Mvc": "6.0.0-beta8",
    "Microsoft.AspNet.Hosting": "1.0.0-beta8"
  },
  "commands": {
    "web": "Microsoft.AspNet.Server.Kestrel --server.urls http://*:5000"
  },
  "frameworks": {
    "dnx451": {},
    "dnxcore50": {}
  },
  "exclude": [
    "wwwroot",
    "node_modules"
  ],
  "publishExclude": [
    "**.user",
    "**.vspscc"
  ]
}

Публикуем наш проект в файл:

Теперь переносим содержимое папки «PublishOutput» на сервер в папку «C:\inetpub». В итоге структура на сервере должна выглядеть вот так:

Заглянем в «wwwroot». Обратите внимание на Web.config. Он ничего, кроме инструкции о передаче управления в «HTTP Platform Handler», по сути, не содержит:

В атрибуте «processPath» содержится путь к внешнему процессу, который нужно запустить для обработки нашего запроса. Давайте посмотрим в папку «approot»:

В папке «src» лежат исходники нашего приложения. В «runtimes» лежит наш DNX, а в «packages» лежат доп. библиотеки, которые нужны для работы нашего решения. Иными словами, при публикации Visual Studio генерит папку, в которой находится все необходимое для запуска веб приложения. И если не стоит задача проксировать запросы через IIS, то просто запустив файлик «web.cmd», мы получим наше приложение, запущенное по порту 5000:

А если мы зайдем по порту 80 (предварительно закрыв наш web.cmd), то запросы теперь будут роутится через IIS:

На этом публикация на сервер завершена.

К сожалению, на сейчас нет опции публикации ASP.NET 5 приложения с использованием классического механизма «Web Deploy». Но это временно, ASP.NET 5 еще не вышел в релиз, посему пока это простительно.

Послесловие

Я бы хотел еще пару слов сказать об опции публикации приложения в сервис «Azure Web Apps»:

Это достаточно простой и удобный способ опубликовать приложение в облачную инфраструктуру Azure, не заморачиваясь всеми этими действиями, которые я делал руками. Естественно, для этого нужно иметь облачную подписку, и тут я бы хотел пару слов рассказать о «Visual Studio Dev Essentials», который анонсировали на конференции «Connect() 2015». Суть состоит в том, что появился бесплатный набор утилит и сервисов, который теперь доступен любому разработчику. Там же и Azure на сумму $25 бесплатно.


P.S. Дописываю статью по нагрузочному тесту. В следующем материале расскажу, как создавать и проводить Load Tests, используя Visual Studio и облачную инфраструктуру.



Предыдущие части:
— ASP.NET 5 — взгляд внутрь. Об изменениях ядра и инфраструктуры
— ASP.NET 5: что изменилось для разработчика
— ASP.NET 5: публикуем приложение на Linux

LinkedIn

Похожие статьи

6 комментариев

Подписаться на комментарииОтписаться от комментариев Комментарии могут оставлять только пользователи с подтвержденными аккаунтами.

Дааа, в новой версии так много нового конечно. Спасибо за статьи. Обычно всё это было раскидано по инету кусками, а тут по шагам, чётко.
С нетерпением жду статью по нагрузочному тесту :)

Було б цікаво глянути як це все робиться через powershell, так як UI на сервері в сучасному світі не дуже актуально.

По идее не должно быть ничего сложного. Каждый деплой это ведь по сути просто копирование файлов. Единственное что наверное нужно тушить сайт что бы он отпустил файлики.
А для первичного разворачивания все тоже уже есть. Устанавливаются компоненты IIS, далее «HTTP Platform Handler» я думаю что он может устанавливаться тихо. Создание сайт, создание пула, конфигурирование пула.

$appPoolPath = "IIS:\AppPools\" + $name;
$appPool = New-Item $appPoolPath
$appPool... (Настраиваете как хотите)
Set-Item -Path $appPoolPath -Value $appPool

С сайтом приблизительно так же:

WebAdministration\New-Website -Name $name -Port $port -PhysicalPath $path -ApplicationPool $name

Само собой перед этим нужно подключить модуль

Import-Module WebAdministration -Scope Global

Гляньте сюда: aspnet/vsweb-publish
Это готовый скрипт для публикации испод Visual Studio.

Подписаться на комментарии