![](https://habrastorage.org/getpro/habr/upload_files/ef8/81e/aa9/ef881eaa9f14602b803d58e8ec67ac79.png)
В этой статье представлено пошаговое руководство по развертыванию веб-приложений ASP.NET (на примере проекта на фреймворке DotVVM) на виртуальной машине Ubuntu Server 20.04 в Microsoft Azure.
Вот основные шаги, которые мы разберем:
создание виртуальной машины в Azure на основе дистрибутива Linux;
установка среды выполнения .NET и сервера Apache на виртуальную МАШИНУ;
публикация веб-приложения ASP.NET в Visual Studio 2019;
размещение веб-приложения на виртуальной машине;
подключение базы данных в виртуальной машине.
Создание виртуальной машины в Azure на основе дистрибутива Linux
Для начала нам понадобится подписка на Azure. Если у вас ее нет, учетную запись можно бесплатно создать здесь.
Перейдите на портал Azure, найдите вкладку Virtual Machines (Виртуальные машины) и создайте новую машину. В этом процессе есть несколько важных моментов, которые мы подробно рассмотрим ниже.
Общие настройки
Для начала нужно указать подписку, группу ресурсов и параметры нового экземпляра. На этом этапе мы выберем операционную систему (в нашем случае — Ubuntu Server 20.04) и размер виртуальной машины.
![](https://habrastorage.org/getpro/habr/upload_files/5ed/770/d1d/5ed770d1dac8d1c5422f642722970ac7.png)
Теперь нужно ввести данные учетной записи администратора — имя пользователя и пароль. Это очень важно, чтобы в дальнейшем получить доступ к нашей машине. Здесь нам предлагают выбрать из двух опций — создать открытый ключ SSH (SSH public key) или придумать пароль. Выбрав вариант с паролем, увидим такую форму:
![](https://habrastorage.org/getpro/habr/upload_files/635/c29/1f8/635c291f8a381222ba219668e0b76319.png)
Осталось определить правила для входящих портов. В данном случае нам понадобится порт 80 для HTTP-соединений, который позволит получить доступ к сайту в браузере. Другой порт — SSH (22) — обеспечит удаленный доступ к виртуальной машине.
![](https://habrastorage.org/getpro/habr/upload_files/7c4/a59/adb/7c4a59adb35fab10922d8a201de09351.png)
Дальнейшие настройки
Теперь, когда мы указали основную информацию, можно еще раз проверить все параметры и создать машину. В другом сценарии мы также могли бы указать тип жесткого диска (SSD или HDD), конфигурацию сети, балансировку нагрузки, параметры управления самой машиной и расширениями.
Закончив с настройками, запустите процесс создания машины. Это займет несколько минут.
Когда все готово, перейдем в главный раздел Azure и получим открытый IP-адрес, назначенный нашей виртуальной машине.
![](https://habrastorage.org/getpro/habr/upload_files/d8c/15b/cac/d8c15bcaccbdc19e920aacd37b0fc673.png)
В его настройках мы можем выбрать опцию Static (статический) — это значит, что IP-адрес не будет меняться во время перезагрузки виртуальной машины. Мы также можем указать DNS для нашего открытого IP-адреса.
![](https://habrastorage.org/getpro/habr/upload_files/269/397/5d1/2693975d1f27ac2c3d09e95baa2a402f.png)
Установка среды выполнения .NET и сервера Apache на виртуальную машину
Теперь, когда у нас есть виртуальная машина с Ubuntu Server 20.04, размещенная в Azure, мы можем установить с ней удаленное соединение по протоколу SSH (Secure Shell) через консоль управления.
Запустим следующую команду с именем пользователя (которое мы указали при создании ВМ в Azure), IP-адресом или DNS:
ssh azureuser@40.77.109.26
Здесь нужно ввести учетные данные для доступа к машине:
![](https://habrastorage.org/getpro/habr/upload_files/694/63f/a02/69463fa02d15c503f21877ec34329fa2.png)
Установка .NET
Для начала установим пакет .NET SDK. Это можно сделать с помощью APT и нескольких команд. Перед установкой .NET необходимо внести ключ подписи пакета Microsoft в список доверенных ключей и указать путь к репозиторию пакета.
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
Если вы установите .NET SDK, устанавливать среду выполнения отдельно уже не нужно. Для установки .NET SDK выполним следующие команды:
sudo apt-get update
sudo apt-get install -y apt-transport-https
sudo apt-get update
sudo apt-get install -y dotnet-sdk-5.0
Таким образом мы установим среду выполнения .NET на нашу виртуальную машину. Чтобы выполнить верификацию установленного пакета SDK, введите следующую команду:
dotnet --version
![](https://habrastorage.org/getpro/habr/upload_files/112/9d8/f83/1129d8f8369a67532d60ebb8a305f2ac.png)
Установка Apache
Чтобы сделать наше приложение доступным в интернете, нам понадобятся IIS, Nginx или Apache в качестве обратного прокси-сервера, который будет принимать HTTP-запросы и перенаправлять их на Kestrel (веб-сервер, который по умолчанию включен в шаблоны проектов ASP.NET).
Для установки Apache мы должны ввести следующие команды:
sudo apt-get install apache2
Учитывая, что порт 80 нашей виртуальной машины открыт, мы можем скопировать ее открытый IP-адрес или DNS и запустить их в браузере. Если Apache установлен правильно, мы увидим его стартовую страницу:
![](https://habrastorage.org/getpro/habr/upload_files/0ca/b98/60d/0cab9860df013484fec8475b941204a9.png)
Теперь нам понадобятся модули Apache mod_proxy
для выполнения функций обратного прокси-сервера:
systemctl restart apache2
a2enmod proxy proxy_http proxy_html
Публикация веб-приложения ASP.NET в Visual Studio 2019
Итак, мы установили на нашу виртуальную машину с Ubuntu Server 20.04, размещенную в Azure, все необходимые компоненты. Теперь можно приступать к развертыванию веб-приложения в среде выполнения .NET.
Для примера возьмем веб-приложение, созданное на фреймворке DotVVM, в основе которого лежит шаблон MVVM из ASP.NET 5.
Для начала откроем наше решение в Visual Studio 2019, выберем основной проект (в нашем случае на DotVVM) в среде .NET и нажмем кнопку Publish (Опубликовать).
![](https://habrastorage.org/getpro/habr/upload_files/f98/61f/aba/f9861faba06f9be5341ded5ce22068d2.png)
В открывшемся диалоговом окне создадим новый профиль публикации типа Folder (Папка) и укажем путь к папке для развертывания файлов:
![](https://habrastorage.org/getpro/habr/upload_files/b33/da6/69b/b33da669b1adba11ccf8c5755db16dca.png)
Теперь опубликуем решение из созданного профиля:
![](https://habrastorage.org/getpro/habr/upload_files/9c5/00a/f61/9c500af610738cadffaa3755dd097d59.png)
В результате наши файлы будут развернуты в указанной папке:
![](https://habrastorage.org/getpro/habr/upload_files/8ac/5b6/5e7/8ac5b65e7f36e8a70e7320b90cb5581c.png)
Мы используем их для выполнения следующей операции на виртуальной машине.
Размещение веб-приложения на виртуальной машине
Настройка сервера Apache
Файлы конфигурации в Apache хранятся в каталоге /etc/apache2/conf-enabled
. Чтобы подключиться к виртуальной машине по протоколу SSH, нужно создать для нашего веб-приложения файл .conf
. Это можно сделать в текстовом редакторе Nano:
sudo nano /etc/apache2/conf-enabled/DotNetApp.conf
Обратите внимание: вы можете задать нужное вам имя файла.
Содержимое нашего файла DotNetApp.conf
будет таким:
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:5000/
ProxyPassReverse / http://127.0.0.1:5000/
ErrorLog /var/log/apache2/DotNetApp-error.log
CustomLog /var/log/apache2/DotNetApp-access.log common
</VirtualHost>
В среде .NET консоль управления по умолчанию запускает веб-приложения через порт 5000. Если вы хотите использовать другой порт, укажите его в webBuilder
, добавив класс нашего проекта Program.cs, как показано ниже.
.UseUrls("http://*:8080")
Помимо этого, в файле конфигурации DotNetApp.conf
мы указали, что к нашему приложению можно получить доступ через порт 80. В таком случае мы можем сменить порт, но важно при этом не забыть сделать то же самое в настройках нашей виртуальной машины в Azure.
Копирование файлов приложения на виртуальную машину
Теперь нужно изменить настройки веб-приложения так, чтобы оно стало доступным через порт 80. Для этого мы копируем файлы, развернутые в Visual Studio 2019, на виртуальную машину. Это можно сделать из каталога /var/.
cd /var/
sudo mkdir DotNetApp
Теперь выполним передачу файлов. В Windows для этого используется программа WinSCP, которая позволяет подключаться к виртуальным машинам.
Установочный пакет WinSCP: https://winscp.net/eng/download.php.
Завершив установку и инициализацию WinSCP, создадим на виртуальной машине в Azure новый сеанс с нашими учетными данными.
![](https://habrastorage.org/getpro/habr/upload_files/589/039/821/589039821c4ca3bfda43ce6f855f73b1.png)
В папке пользователя по умолчанию создадим новую папку, например App, и скопируем в нее файлы приложения:
![](https://habrastorage.org/getpro/habr/upload_files/799/f29/73b/799f2973bb350dbc48b33c0550b35879.png)
Итак, все файлы приложения загружены на виртуальную машину. Далее нужно перенести файлы из каталога /home/azureuser/App
в каталог /var/DotNetApp
.
cd /home/azureuser/App
sudo cp -R * /var/DotNetApp/
Теперь наше веб-приложение полностью размещено на виртуальной машине.
![](https://habrastorage.org/getpro/habr/upload_files/be8/53f/dcf/be853fdcfede1a35905f22a5d2141ddb.png)
Создание службы для запуска приложения и контроля его работы
Чтобы создать файл службы, который позволит запускать наше веб-приложение, откроем редактор Nano:
sudo nano /etc/systemd/system/kestrel-DotNetApp.service
В содержимом файла укажем рабочий каталог и файл для запуска веб-приложения.
[Unit]
Description=Aspnet 5 Web App running on Ubuntu
[Service]
WorkingDirectory=/var/DotNetApp
ExecStart=/usr/bin/dotnet /var/DotNetApp/UserDashboard.dll
Restart=always
RestartSec=10
SyslogIdentifier=dotnet-demo
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
[Install]
WantedBy=multi-user.target
Запустим созданную службу.
sudo systemctl enable kestrel-DotNetApp.service
sudo systemctl start kestrel-DotNetApp.service
Используя атрибут status
, мы можем проверить ее текущее состояние.
![](https://habrastorage.org/getpro/habr/upload_files/593/fb1/de9/593fb1de9c169b638aa89d98ebb907db.png)
Теперь перезапустим сервер Apache и убедимся, что наше приложение работает через порт 80.
systemctl restart apache2
sudo service apache2 restart
![](https://habrastorage.org/getpro/habr/upload_files/70e/39f/039/70e39f039454f47d513d8205dd198c08.png)
Завершив размещение и настройку, мы сможем получить доступ к веб-приложению через браузер, используя назначенный IP-адрес или DNS-имя. Как видите, наше приложение ASP.NET, созданное на фреймворке DotVVM, отлично работает на виртуальной машине Linux в Azure.
![](https://habrastorage.org/getpro/habr/upload_files/bb0/969/089/bb096908916ca2d9eb7044b1459affd8.png)
Подключение базы данных в виртуальной машине
Итак, мы успешно завершили установку приложения. Но это еще не все. Большинство современных веб-проектов (если не все) связаны с базами данных. В этом примере мы разберем, как установить на виртуальную машину базу данных PostgreSQL и связать ее с нашим проектом на DotVVM в ASP.NET 5.
Для установки PostgreSQL введем следующие команды:
sudo apt install postgresql postgresql-contrib
Далее в настройках виртуальной машины в Azure нужно открыть порт 5432 для удаленного доступа к PostgreSQL.
![](https://habrastorage.org/getpro/habr/upload_files/f4d/445/813/f4d445813469138a0b68752416141a58.png)
Теперь на Ubuntu Server мы должны внести изменения в файл pg_hba.conf, чтобы разрешить удаленное подключение к PostgreSQL.
sudo nano /etc/postgresql/12/main/pg_hba.conf
Пропишем в секции IPv4 local connections файла pg_hba.conf следующую строку:
# IPv4 local connections:
host all all all md5
Еще один файл, в который мы должны внести изменения, называется postgresql.conf. Эта конфигурация определяет, какие IP-адреса могут удаленно подключаться к PostgreSQL.
sudo nano /etc/postgresql/12/main/postgresql.conf
В секции Connections and Authentication удалим символ # и оставим следующую строку:
listen_addresses = '*'
Теперь перезапустим службу базы данных.
sudo service postgresql restart
Установив эти настройки, мы можем создать пользователя для доступа к базе данных, как в этом примере:
sudo -u postgres psql
CREATE USER admin PASSWORD 'Abc#1234'
ALTER ROLE admin WITH SUPERUSER;
![](https://habrastorage.org/getpro/habr/upload_files/60d/b9a/6cf/60db9a6cf7f93aafdc79b17fdf094208.png)
Осталось только изменить соответствующие настройки нашей базы данных. Сделав это, мы сможем удаленно подключаться к ней от имени пользователя, которого мы только что создали.
![](https://habrastorage.org/getpro/habr/upload_files/3ef/8e4/9ee/3ef8e49eef54a5f8dfab2f76a30cd541.png)
В завершение мы должны установить в нашем веб-приложении новое подключение к базе данных.
host=localhost;port=5432;Username=admin;Password=Abc#1234;Database=postgres
Чтобы эти изменения вступили в силу, нужно заменить файлы в каталоге /var/DotNetApp
на другие, с новой конфигурацией, и перезапустить соответствующие службы (Kestrel и Apache).
Что дальше?
В этой статье мы пошагово разобрали механизм развертывания веб-приложения ASP.NET 5 на фреймворке DotVVM — сначала в Visual Studio 2019, а затем на виртуальной машине Ubuntu Server 20.04, размещенной в Azure. Ниже вы найдете несколько полезных ресурсов, которые помогут вам узнать больше о разработке приложений с помощью .NET и Azure:
Спасибо за внимание
Спасибо, что прочитали эту статью. Надеюсь, она показалась вам интересной и полезной. Если у вас появились вопросы или идеи, которыми хочется поделиться, я всегда открыт для общения, участия в совместных проектах и обмена опытом.
Материал подготовлен в рамках курса «C# Developer. Professional».
Всех желающих приглашаем на открытый урок «Как устроена сериализация». На занятии мы:
— Рассмотрим, что такое сериализации, и какие бывают форматы: плюсы и минусы каждого;
— Поработаем с XML, JSON и бинарным представлением данных языка.
>> РЕГИСТРАЦИЯ
Комментарии (4)
korsetlr473
30.09.2021 15:34"Для начала нам понадобится подписка на Azure. Если у вас ее нет, учетную запись можно бесплатно создать здесь. "
не смог зарегаться , карту просит обязательно
korsetlr473
30.09.2021 15:42добавлю , попробовал новый аккаунт создать (через почту)
на этапе связки с azure просит теелфон
AikoKirino
01.10.2021 10:13+2На моменте с апачем конечно всхохотнул. Тем более для hello world хватит и kestrel, да что там - его можно вообще голым местом выставлять и на реальных инсталляциях.
rumatavz
К этому нужно вверху написать - вот вам методика, но ради всего святого, никогда так не делайте. Пользуйтесь кубером или хотябы докером. А если вам лень, то разверните аппу в Azure App Service.