如何在Ubuntu 18.04上使用Nginx在MySQL服务器上部署ASP.NET核心应用程序

ASP.NET Core是Microsoft ASP.NET Framework的更加模块化版本。它是用于构建现代Web应用程序的高性能,开源框架。在本教程中,您将使用Nginx在Ubuntu 18.04上设置和部署带有MySQL服务器的生产就绪的ASP.NET Core应用程序。

作者选择开源计划作为Write for DOnations计划的一部分接受捐赠。

介绍

ASP.NET Core是一个高性能的开源框架,用于构建现代Web应用程序,旨在成为Microsoft ASP.NET框架的更加模块化的版本。 它于2016年发布,可以在Linux和macOS等多种操作系统上运行。 这使开发人员能够根据设计要求将特定操作系统作为开发目标。 使用ASP.NET Core,开发人员可以构建任何类型的Web应用程序或服务,而不管其复杂性和大小。 开发人员还可以利用Razor页面创建基于传统模型 - 视图 - 控制器 (MVC)模式的以页面为中心的设计。

ASP.NET Core提供了与任何前端框架集成的灵活性,以处理客户端逻辑或使用Web服务。 例如,您可以使用ASP.NET Core构建RESTful API,并使用Angular,React和Vue.js等JavaScript框架轻松使用它。

在本教程中,您将使用Nginx在Ubuntu 18.04上设置和部署带有MySQL服务器的生产就绪的ASP.NET Core应用程序。 您将部署一个演示ASP.NET Core应用程序,类似于Microsoft文档中的应用程序并托管在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

使用带有-i标志的dpkg来安装指定的文件:

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运行时SDK:

sudo apt install dotnet-sdk-2.2

系统将提示您将安装其他文件大小的详细信息。 键入Y ENTER继续。

现在您已经在服务器上安装了.NET Core运行时SDK,您几乎已准备好从GitHub下载演示应用程序并设置部署配置。 但首先,您将为应用程序创建数据库。

第2步 - 创建MySQL用户和数据库

在本节中,您将创建一个MySQL服务器用户,为应用程序创建一个数据库,并为新用户授予从应用程序连接到数据库的所有必要权限。

首先,您需要使用MySQL root帐户访问MySQL客户端,如下所示:

mysql -u root -p

系统将提示您输入在必备教程中设置的root帐户密码。

接下来,为应用程序创建一个MySQL数据库:

CREATE DATABASE MovieAppDb;

您将在控制台中看到以下输出:

Query OK, 1 row affected (0.03 sec)

您现在已成功创建数据库。 接下来,您将创建一个新的MySQL用户,将它们与新创建的数据库关联,并授予他们所有权限。

执行以下命令,创建MySQL用户和密码。 请记住将用户名和密码更改为更安全的内容:

CREATE USER 'movie-admin'@'localhost' IDENTIFIED BY 'password';

您将看到以下输出:

Query OK, 0 rows affected (0.02 sec)

要访问数据库或对其执行特定操作,MySQL用户需要相应的权限。 目前, movie-admin对应用程序数据库没有适当的权限。

您将通过运行以下命令来更改它,以授予对MovieAppDb上的movie-admin的访问权限:

GRANT ALL PRIVILEGES ON MovieAppDb.* TO 'movie-admin'@'localhost';

您将看到以下输出:

Query OK, 0 rows affected (0.01 sec)

现在,您可以通过运行以下命令来重新加载授权表,以使用flush语句应用您刚刚进行的更改:

FLUSH PRIVILEGES;

您将看到以下输出:

Query OK, 0 rows affected (0.00 sec)

您已完成创建新用户并授予权限。 要测试您是否正常,请退出MySQL客户端:

quit;

使用刚刚创建的MySQL用户的凭据再次登录,并在出现提示时输入相应的密码:

mysql -u movie-admin -p

检查以确保用户movie-admin可以访问创建的数据库,请检查:

SHOW DATABASES;

您将看到输出中列出的MovieAppDb表:

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

现在,退出MySQL客户端:

quit;

您已经创建了一个数据库,为演示应用程序创建了一个新的MySQL用户,并授予新创建的用户访问数据库的正确权限。 在下一节中,您将开始设置演示应用程序。

第3步 - 设置演示应用程序和数据库凭据

如前所述,您将部署现有的ASP.NET Core应用程序。 此应用程序用于创建电影列表,它使用模型 - 视图 - 控制器设计模式来确保正确的结构和关注点分离。 要在列表中创建或添加新影片,用户将使用适当的详细信息填充表单字段,然后单击“ 创建”按钮将详细信息发布到控制器。 此时控制器将收到带有提交详细信息的POST HTTP请求,并通过模型将数据保存在数据库中。

您将使用GitGitHub中提取此演示应用程序的源代码并将其保存在新目录中。 如果您要部署其他应用程序,也可以在此处下载备用应用程序。

首先,使用以下命令从终端创建名为movie-app的新目录:

sudo mkdir -p /var/www/movie-app

这将作为您的应用程序的根目录。 接下来,更改文件夹所有者和组,以允许非root用户帐户使用项目文件:

sudo chown sammy:sammy /var/www/movie-app

用你的sudo非root用户名替换sammy

现在,您可以进入父目录并在GitHub上克隆应用程序:

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

您将看到以下输出:

Cloning into 'movie-app'...
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克隆了演示应用程序,因此下一步将是创建与应用程序数据库的成功连接。 您将通过编辑appsettings.json文件中的ConnectionStrings属性并添加数据库的详细信息来完成此操作。

将目录更改为应用程序:

cd movie-app

现在打开文件进行编辑:

sudo nano appsettings.json

添加数据库凭据:

appsettings.json
{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "MovieContext": "Server=localhost;User Id=movie-admin;Password=password;Database=MovieAppDb"
  }
}

有了这个,您就已经成功创建了与数据库的连接。 现在按CTRL+X将更改保存到文件并键入Y进行确认。 然后按ENTER退出页面。

ASP.NET Core应用程序使用名为Entity Framework (EF)Cor​​e的.NET标准库来管理与数据库的交互。 Entity Framework Core是流行的Entity Framework数据访问技术的轻量级跨平台版本。 它是一个对象关系映射器(ORM),它使.NET开发人员能够使用任何数据库提供程序(如MySQL)使用数据库。

您现在可以使用克隆的演示应用程序中的表更新数据库。 为此目的运行以下命令:

dotnet ef database update

这将对数据库应用更新并创建适当的模式。

现在,要构建项目及其所有依赖项,请运行以下命令:

dotnet build

你会看到类似于的输出:

Microsoft (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/movie-app/MvcMovie.csproj.
  MvcMovie -> /var/www/movie-app/bin/Debug/netcoreapp2.2/MvcMovie.dll
  MvcMovie -> /var/www/movie-app/bin/Debug/netcoreapp2.2/MvcMovie.Views.dll

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

Time Elapsed 00:00:01.91

这将构建项目并安装project.assets.json文件中列出的任何第三方依赖项,但该应用程序尚未准备好进行生产。 要使应用程序准备好部署,请运行以下命令:

dotnet publish

您将看到以下内容:

Microsoft (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/movie-app/bin/Debug/netcoreapp2.2/MvcMovie.dll
MvcMovie -> /var/www/movie-app/bin/Debug/netcoreapp2.2/MvcMovie.Views.dll
MvcMovie -> /var/www/movie-app/bin/Debug/netcoreapp2.2/publish/

这将打包并编译应用程序,读取其依赖项,将生成的文件集发布到用于部署的文件夹中,并生成跨平台.dll文件,该文件使用已安装的.NET Core运行时来运行应用程序。

通过安装依赖项,创建与数据库的连接,使用必要的表更新数据库,并将其发布以进行生产,您已完成此演示应用程序的设置。 在下一步中,您将配置Web服务器,以使您的域可以访问和保护应用程序。

第4步 - 配置Web服务器

到目前为止,已经按照如何使用Let's Encrypt安全Nginx教程 ,您将在/etc/nginx/sites-available/ your_domain为您的域设置一个服务器块,并已正确设置server_name指令。 在此步骤中,您将编辑此服务器块以将Nginx配置为应用程序的反向代理。 反向代理是位于Web服务器前面的服务器,它将每个Web浏览器的请求转发给这些Web服务器。 它接收来自网络的所有请求,并将它们转发到不同的Web服务器。

对于ASP.NET Core应用程序, Kestrel是默认情况下包含的首选Web服务器。 它非常适合从ASP.NET Core应用程序提供动态内容,因为它提供了更好的请求处理性能,旨在使ASP.NET尽可能快。 但是,Kestrel不被视为功能齐全的Web服务器,因为它无法管理安全性并提供静态文件,因此建议始终在Web服务器后运行它。

首先,请确保您位于服务器的根目录中:

cd ~

打开服务器块以进行编辑:

sudo nano /etc/nginx/sites-available/your_domain

如“ 如何使用Let的加密来保护Nginx”教程中的第4步所详述,如果您选择了选项2,Certbot将自动配置此服务器块,以便通过一些修改将HTTP流量重定向到HTTPS。

通过编辑文件中的前两个块来继续配置以反映以下内容:

在/ etc / nginx的/网站可用/您的域
server {

    server_name your-domain  www.your-domain;

   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/your-domain/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/your-domain/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 ,端口443是使用SSL的网站的标准端口。 此外,Nginx将接受端口443上的公共流量,并将每个匹配请求转发到http://localhost:5000的内置Kestrel服务器。

最后,在您刚刚在文件中编辑的服务器块之后,确保第二个服务器块如下所示:

在/ etc / nginx的/网站可用/您的域

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


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


    listen 80;
    listen [::]:80;

    server_name your-domain  www.your-domain;
return 404; # managed by Certbot
}

此服务器块会将所有请求重定向到https:// your-domainhttps://www. your-domain https://www. your-domain到安全的HTTPS访问。

接下来,强制Nginx通过运行以下内容来获取您对服务器块所做的更改:

sudo nginx -s reload

成功完成Nginx配置后,服务器完全设置为将对https:// your-domain所有HTTPS请求转发到运行在Kestrel上的http://localhost:5000的ASP.NET Core应用程序。 但是,Nginx未设置为管理Kestrel服务器进程。 要处理此问题并确保Kestrel进程在后台继续运行,您将使用systemd功能。

系统文件将允许您在创建称为单元的工作流程后通过提供启动,停止,重新启动和日志功能来管理流程。

进入systemd目录:

cd /etc/systemd/systems

创建一个新文件进行编辑:

sudo nano movie.service

添加以下内容:

movie.service
[Unit]
Description=Movie app

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

[Install]
WantedBy=multi-user.target

配置文件使用WorkingDirectory指定项目文件夹的位置,并在ExecStartExecStart在进程开始时执行的命令。 此外,如果.NET运行时服务崩溃,您已使用RestartSec指令指定何时重新启动systemd服务。

现在保存文件并启用使用以下创建的新电影服务:

sudo systemctl enable movie.service

之后,继续启动服务并通过启动服务验证它是否正在运行:

sudo systemctl start movie.service

然后检查其状态:

sudo systemctl status movie.service

您将看到以下输出:

movie.service - Movie app
   Loaded: loaded (/etc/systemd/system/movie.service; 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/movie.service
           └─6038 /usr/bin/dotnet /var/www/movie-app/bin/Debug/netcoreapp2.2/publish/MvcMovie.dll

此输出为您提供了为保持应用程序运行而创建的movie.service的当前状态的概述。 它表示该服务已启用且当前处于活动状态。

从浏览器导航到https:// your-domain以运行并测试应用程序。

您将看到演示应用程序的主页 - 电影列表应用程序

电影列表应用

通过配置反向代理并通过systemd管理Kestrel,Web应用程序已完全配置,可以从浏览器访问。

结论

在本教程中,您将ASP.NET Core应用程序部署到Ubuntu服务器。 为了持久化和管理数据,您安装并使用了MySQL服务器,并使用Nginx Web服务器作为反向代理来为您的应用程序提供服务。

除了本教程之外,如果您对使用C#而不是Javascript构建交互式Web应用程序感兴趣,可以尝试使用Microsoft称为Blazor的Web UI框架。 它是一个事件驱动的基于组件的Web UI,用于在ASP.NET Core应用程序的客户端实现逻辑。

如果您希望部署自己的应用程序,则需要考虑部署应用程序所需的其他步骤。 可以在GitHub上找到此演示应用程序的完整源代码。