Как развернуть приложение ASP.NET Core с MySQL Server, используя Nginx в Ubuntu 18.04

_ Автор выбрал Open Source Initiative, чтобы получить пожертвование как часть Write for DOnations program._

Вступление

ASP.NET Core - это высокопроизводительная среда с открытым исходным кодом для создания современных веб-приложений, предназначенная для более модульной версии. Microsoft’s ASP.NET Framework. Выпущенный в 2016 году, он может работать на нескольких операционных системах, таких как Linux и macOS. Это позволяет разработчикам ориентироваться на конкретную операционную систему для разработки на основе требований к дизайну. С помощью ASP.NET Core разработчик может создавать любые веб-приложения или службы независимо от их сложности и размера. Разработчики также могут использовать Razor pages для создания работы, ориентированной на страницы. поверх традиционного шаблона Model-View-Controller (MVC).

ASP.NET Core обеспечивает гибкость интеграции с любыми интерфейсными средами для обработки клиентской логики или использования веб-службы. Вы можете, например, создать RESTful API с помощью ASP.NET Core и легко использовать его с такими JavaScript-фреймворками, как Angular, React и Vue.js.

В этом руководстве вы настроите и развернете готовое к работе приложение ASP.NET Core с MySQL Server в Ubuntu 18.04 с использованием Nginx. Вы развернете демонстрационное приложение ASP.NET Core, аналогичное приложению из документации Microsoft и размещенное по адресу https://github.com/aspnet/AspNetCore.Docs/tree/master/aspnetcore/tutorials/razor-pages/razor-pages- Пуск / 2,2-Stage-образцы [GitHub]. После развертывания демонстрационное приложение позволит вам создать список фильмов и сохранить его в базе данных. Вы сможете создавать, читать, обновлять и удалять записи из базы данных. Вы можете использовать это руководство для развертывания своего собственного приложения ASP.NET Core; Возможно, вам придется выполнить дополнительные действия, которые включают создание нового файла миграции для вашей базы данных.

Предпосылки

Для этого урока вам понадобится следующее:

Шаг 1 - Установка .NET Core Runtime

Среда выполнения .NET Core требуется для успешного запуска приложения .NET Core, поэтому вы начнете с установки этого на свой компьютер. Для начала вам необходимо зарегистрировать Microsoft Key и репозиторий продукта. После этого вы установите необходимые зависимости.

Сначала войдите в систему как ваш новый созданный пользователь, убедитесь, что вы находитесь в корневом каталоге:

cd ~

Затем выполните следующую команду, чтобы зарегистрировать ключ Microsoft и репозиторий продукта:

wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb

Используйте + dpkg + с флагом + -i + для установки указанного файла:

sudo dpkg -i packages-microsoft-prod.deb

Чтобы упростить установку других пакетов, необходимых для вашего приложения, вы установите репозиторий + universe + с помощью следующей команды:

sudo add-apt-repository universe

Затем установите пакет + apt-transport, чтобы разрешить использование репозиториев, доступных по протоколу HTTP Secure:

sudo apt install apt-transport-https

Теперь выполните следующую команду, чтобы загрузить список пакетов из репозиториев и обновить их, чтобы получить информацию о новейших версиях пакетов и их зависимостях:

sudo apt update

Наконец, вы можете установить .NET runtime SDK с помощью:

sudo apt install dotnet-sdk-2.2

Вам будет предложено указать размер дополнительных файлов, которые будут установлены. Введите + Y + и нажмите + ENTER +, чтобы продолжить.

Теперь, когда вы завершили установку SDK среды выполнения .NET Core на сервере, вы почти готовы загрузить демонстрационное приложение из GitHub и настроить конфигурацию развертывания. Но сначала вы создадите базу данных для приложения.

Шаг 2 - Создание пользователя и базы данных MySQL

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

Для начала вам необходимо получить доступ к клиенту MySQL, используя корневую учетную запись MySQL, как показано здесь:

mysql -u root -p

Вам будет предложено ввести пароль учетной записи root, настроенный во время предварительного обучения.

Затем создайте базу данных MySQL для приложения с помощью:

CREATE DATABASE ;

Вы увидите следующий вывод в консоли:

OutputQuery OK, 1 row affected (0.03 sec)

Вы успешно создали базу данных. Затем вы создадите нового пользователя MySQL, свяжете его с вновь созданной базой данных и предоставите им все привилегии.

Выполните следующую команду, чтобы создать пользователя и пароль MySQL. Не забудьте изменить имя пользователя и пароль на что-то более безопасное:

CREATE USER ''@'localhost' IDENTIFIED BY '';

Вы увидите следующий вывод:

OutputQuery OK, 0 rows affected (0.02 sec)

Для доступа к базе данных или выполнения определенных действий с ней пользователю MySQL необходимо соответствующее разрешение. На данный момент * movie-admin * не имеет соответствующих прав доступа к базе данных приложения.

Вы измените это, выполнив следующую команду для предоставления доступа к * movie-admin * на ++:

GRANT ALL PRIVILEGES ON .* TO ''@'localhost';

Вы увидите следующий вывод:

OutputQuery OK, 0 rows affected (0.01 sec)

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

FLUSH PRIVILEGES;

Вы увидите следующий вывод:

OutputQuery OK, 0 rows affected (0.00 sec)

Вы закончили создание нового пользователя и предоставление привилегий. Чтобы проверить, что вы на правильном пути, выйдите из клиента MySQL:

quit;

Войдите снова, используя учетные данные только что созданного пользователя MySQL, и введите соответствующий пароль при появлении запроса:

mysql -u  -p

Убедитесь, что пользователь * movie-admin * может получить доступ к созданной базе данных, проверьте с помощью:

SHOW DATABASES;

Вы увидите таблицу ++, перечисленную в выводе:

Output+--------------------+
| Database           |
+--------------------+
|          |
| information_schema |
+--------------------+
2 rows in set (0.01 sec)

Теперь выйдите из клиента MySQL:

quit;

Вы создали базу данных, сделали нового пользователя MySQL для демонстрационного приложения и предоставили вновь созданному пользователю права доступа к базе данных. В следующем разделе вы начнете настраивать демонстрационное приложение.

Шаг 3 - Настройка демонстрационного приложения и учетных данных базы данных

Как указывалось ранее, вы развернете существующее приложение ASP.NET Core. Это приложение было создано для создания списка фильмов и использует шаблон проектирования Model-View-Controller, чтобы обеспечить правильную структуру и разделение задач. Чтобы создать или добавить новый фильм в список, пользователь заполняет поля формы соответствующими данными и нажимает кнопку * Создать *, чтобы опубликовать данные на контроллере. Контроллер в этот момент получит HTTP-запрос POST с отправленными данными и сохранит данные в базе данных через модель.

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

Для начала создайте новый каталог с именем ++ из терминала, используя следующую команду:

sudo mkdir -p /var/www/

Это будет служить корневым каталогом для вашего приложения. Затем измените владельца папки и группу, чтобы позволить учетной записи пользователя без полномочий root работать с файлами проекта:

sudo chown : /var/www/

Замените * sammy * своим именем пользователя sudo без полномочий root.

Теперь вы можете перейти в родительский каталог и клонировать приложение на GitHub:

cd /var/www
git clone https://github.com/do-community/movie-app-list.git

Вы увидите следующий вывод:

OutputCloning into ''...
remote: Enumerating objects: 91, done.
remote: Counting objects: 100% (91/91), done.
remote: Compressing objects: 100% (73/73), done.
remote: Total 91 (delta 13), reused 91 (delta 13), pack-reused 0
Unpacking objects: 100% (91/91), done.

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

Сменить каталог в приложение:

cd

Теперь откройте файл для редактирования:

sudo nano appsettings.json

Добавьте свои учетные данные базы данных:

appsettings.json

{
 "Logging": {
   "LogLevel": {
     "Default": "Warning"
   }
 },
 "AllowedHosts": "*",
 "ConnectionStrings": {
   "MovieContext": "Server=localhost;User Id=;Password=;Database="
 }
}

Благодаря этому вы успешно создали соединение с вашей базой данных. Теперь нажмите + CTRL + X +, чтобы сохранить изменения в файле, и введите + Y + для подтверждения. Затем нажмите + ENTER, чтобы закрыть страницу.

Приложения ASP.NET Core используют стандартную библиотеку .NET с именем Entity Framework (EF) Core для управления взаимодействием с базой данных. Entity Framework Core - это облегченная кроссплатформенная версия популярной технологии доступа к данным Entity Framework. Это объектно-реляционный картограф (ORM), который позволяет разработчикам .NET работать с базой данных с использованием любого из поставщиков баз данных, таких как MySQL.

Теперь вы можете обновить свою базу данных таблицами из клонированного демонстрационного приложения. Для этого выполните следующую команду:

dotnet ef database update

Это позволит применить обновление к базе данных и создать соответствующие схемы.

Теперь, чтобы построить проект и все его зависимости, выполните следующую команду:

dotnet build

Вы увидите вывод, похожий на:

OutputMicrosoft (R) Build Engine version 16.1.76+g14b0a930a7 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

 Restore completed in 95.09 ms for /var/www//MvcMovie.csproj.
 MvcMovie -> /var/www//bin/Debug/netcoreapp2.2/MvcMovie.dll
 MvcMovie -> /var/www//bin/Debug/netcoreapp2.2/MvcMovie.Views.dll

Build succeeded.
   0 Warning(s)
   0 Error(s)

Time Elapsed 00:00:01.91

Это создаст проект и установит все сторонние зависимости, перечисленные в файле ++, но приложение еще не будет готово к работе. Чтобы подготовить приложение к развертыванию, выполните следующую команду:

dotnet publish

Вы увидите следующее:

OutputMicrosoft (R) Build Engine version 16.1.76+g14b0a930a7 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

Restore completed in 89.62 ms for /var/www/movie-app/MvcMovie.csproj.
MvcMovie -> /var/www//bin/Debug/netcoreapp2.2/MvcMovie.dll
MvcMovie -> /var/www//bin/Debug/netcoreapp2.2/MvcMovie.Views.dll
MvcMovie -> /var/www//bin/Debug/netcoreapp2.2/publish/

Это позволит упаковать и скомпилировать приложение, прочитать его зависимости, опубликовать полученный набор файлов в папку для развертывания и создать кросс-платформенный файл + .dll +, который использует установленную среду выполнения .NET Core для запуска приложения.

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

Шаг 4 - Настройка веб-сервера

К настоящему времени, следуя How для защиты Nginx с помощью Let’s Руководство по шифрованию, у вас будет серверный блок для вашего домена по адресу + / etc / nginx / sites-available / + с директивой ++, которая уже установлена ​​соответствующим образом. На этом этапе вы отредактируете этот блок сервера, чтобы настроить Nginx в качестве обратного прокси-сервера для вашего приложения. Обратный прокси-сервер - это сервер, который находится перед веб-серверами и перенаправляет запросы каждого веб-браузера на эти веб-серверы. Он получает все запросы из сети и перенаправляет их на другой веб-сервер.

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

Для начала убедитесь, что вы находитесь в корневом каталоге вашего сервера:

cd ~

Откройте блок сервера для редактирования с помощью:

sudo nano /etc/nginx/sites-available/

Как подробно описано в https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-18-04#step-4-%E2%80 % 94-получение-ан-ssl-сертификата [Шаг 4] https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu- 18-04 [Как защитить Nginx с помощью учебника Let’s Encrypt], если вы выбрали опцию 2, Certbot автоматически настроит этот блок сервера для перенаправления HTTP-трафика в HTTPS с помощью всего лишь нескольких модификаций.

Продолжите настройку, отредактировав первые два блока в файле, чтобы отразить следующее:

/ И т.д. / Nginx / сайты-доступные / ваш-домен

server {

   server_name   www.;

  location / {
    proxy_pass http://localhost:5000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection keep-alive;
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
   }

listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live//fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live//privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot


}
...

Конфигурация в этом блоке сервера будет указывать Nginx прослушивать порт + 443 +, который является стандартным портом для веб-сайтов, использующих SSL. Кроме того, Nginx будет принимать публичный трафик через порт + 443 + и перенаправлять каждый соответствующий запрос на встроенный сервер Kestrel по адресу + http: // localhost: 5000 +.

Наконец, после блока сервера, который вы только что отредактировали в файле, убедитесь, что второй блок сервера выглядит следующим образом:

/ И т.д. / Nginx / сайты-доступные / ваш-домен

...
server {
if ($host = www.) {
   return 301 https://$host$request_uri;
} # managed by Certbot


if ($host = ) {
   return 301 https://$host$request_uri;
} # managed by Certbot


   listen 80;
   listen [::]:80;

   server_name   www.;
return 404; # managed by Certbot
}

Этот блок сервера будет перенаправлять все запросы к + https: // + и + https: // www. + Для безопасного доступа HTTPS.

Затем заставьте Nginx получить изменения, которые вы внесли в блок сервера, запустив:

sudo nginx -s reload

После успешного завершения настройки Nginx сервер полностью настроен для пересылки всех HTTPS-запросов, сделанных на + https: // + в приложении ASP.NET Core, работающем на Kestrel, на + http: // localhost: 5000+ `. Однако Nginx не настроен для управления серверным процессом Kestrel. Чтобы справиться с этим и убедиться, что процесс Kestrel продолжает работать в фоновом режиме, вы будете использовать функциональные возможности `+ systemd +.

Файлы Systemd позволят вам управлять процессом, предоставляя функции запуска, остановки, перезапуска и ведения журнала после создания процесс работы называется единым целым.

Перейдите в каталог + systemd +:

cd /etc/systemd/systems

Создайте новый файл для редактирования:

sudo nano

Добавьте следующий контент:

movie.service

[Unit]
Description=

[Service]
WorkingDirectory=/var/www/
ExecStart=/usr/bin/dotnet /var/www//bin/Debug/netcoreapp2.2/publish/MvcMovie.dll
Restart=always
RestartSec=10
SyslogIdentifier=
User=
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy=multi-user.target

В файле конфигурации указывается расположение папки проекта с помощью + WorkingDirectory + и команда для выполнения в начале процесса в + ExecStart +. Кроме того, вы использовали директиву + RestartSec +, чтобы указать, когда перезапускать службу + systemd + в случае сбоя службы .NET.

Теперь сохраните файл и включите новый сервис фильмов, созданный с помощью:

sudo systemctl enable

После этого перейдите к запуску службы и убедитесь, что она работает, запустив службу:

sudo systemctl start

Затем проверьте его статус:

sudo systemctl status

Вы увидите следующий вывод:

Output -
  Loaded: loaded (/etc/systemd/system/; enabled; vendor preset: enabled)
  Active: active (running) since Sun 2019-06-23 04:51:28 UTC; 11s ago
Main PID: 6038 (dotnet)
   Tasks: 16 (limit: 1152)
  CGroup: /system.slice/
          └─6038 /usr/bin/dotnet /var/www//bin/Debug/netcoreapp2.2/publish/MvcMovie.dll

Эти выходные данные дают вам обзор текущего состояния ++, созданного для поддержания работы вашего приложения. Это указывает на то, что служба включена и в настоящее время активна.

Перейдите к + https: // + в браузере, чтобы запустить и протестировать приложение.

Вы увидите домашнюю страницу демонстрационного приложения - * Приложение списка фильмов *.

изображение: https: //i.imgur.com/VI7KTaU.png [Приложение со списком фильмов]

Если обратный прокси-сервер настроен и Kestrel управляется через systemd, веб-приложение полностью настроено и доступно из браузера.

Заключение

В этом руководстве вы развернули приложение ASP.NET Core на сервере Ubuntu. Чтобы сохранить данные и управлять ими, вы установили и использовали сервер MySQL и использовали веб-сервер Nginx в качестве обратного прокси-сервера для обслуживания своего приложения.

Помимо этого урока, если вы заинтересованы в создании интерактивного веб-приложения с использованием C # вместо Javascript, вы можете попробовать веб-инфраструктуру пользовательского интерфейса Microsoft под названием https://dotnet.microsoft.com/apps/aspnet/web-apps/client [ Blazor]. Это управляемый событиями веб-интерфейс на основе компонентов для реализации логики на стороне клиента приложения ASP.NET Core.

Если вы хотите развернуть собственное приложение, вам нужно будет рассмотреть другие необходимые процедуры для развертывания приложения. Полный исходный код этого демонстрационного приложения можно найти по адресу here на GitHub.

Related