如何在 Ubuntu 18.04 上使用 Nginx 部署带有 MySQL 服务器的 ASP.NET Core 应用程序

作者选择了 开源倡议以作为 写给捐款计划的一部分接受捐款。

介绍

ASP.NET Core是构建现代网络应用的高性能,开源的框架,意为"微软的ASP.NET框架"(https://dotnet.microsoft.com/apps/aspnet)的更模块化版本. 于2016年发布,可以运行于Linux和macOS等多个操作系统上. 这使得开发者能够根据设计要求针对特定开发操作系统. 与 ASP.NET 连接 Core,开发者可以建立任何类型的网络应用程序或服务,而无论复杂程度和大小. 开发者还可以利用Razor pages来创建以页面为重点的设计,在传统的Model-View-Captain模式上工作.

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

在这个教程中,你会设置和部署一个生产准备的ASP. 净额 在Ubuntu 18.04上使用一个MySQL服务器的核心应用程序使用Nginx. 你会部署一个演示ASP。 净额 核心应用程序与从微软文档中获取的应用程序相类似并托管在 [GitHub] (https://github.com/aspnet/AspNetCore.Docs/tree/master/aspnetcore/tutorials/razor-pages/razor-pages-start/2.2-stage-samples). 一旦部署,演示应用程序将允许您创建电影列表并存储在数据库中. 可以创建,阅读,更新,并删除数据库中的记录. 您可以使用此教程来部署自己的 ASP 。 净额 相反,核心应用程序;你可能不得不执行额外的步骤,包括生成一个新的迁移文件,用于您的数据库.

前提条件

您将需要以下内容为本教程:

  • 通过遵循Ubuntu 18.04初始服务器设置指南,包括一个拥有 " sudo " 访问权限和防火墙的非根基用户,设置了一个Ubuntu 18.04服务器。
  • Nginx通过跟踪[如何在Ubuntu 18.04上安装 Nginx (https://andsky.com/tech/tutorials/how-to-install-nginx-on-ubuntu-18-04)而安装.
  • 一个安全的Nginx网络服务器。 您可以在 [How To Secure Nginx with Let's Encrym on Ubuntu 18.04] (https://andsky.com/tech/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-18-04) 上遵循此教程。
  • 为您的服务器设置的下列DNS记录。 您可以跟踪此[引入到 DigitalOcean DNS (https://www.digitalocean.com/docs/networking/dns/) , 了解如何添加它们的细节 。
  • `A'记录,注明你的服务器的公共IP地址。
  • www.your-domain'表示服务器公开IP地址的A'记录。

第1步:安装.NET Core 运行时

需要.NET Core 运行时间才能成功运行.NET Core 应用程序,因此您将首先将此应用程序安装到您的计算机上。

首先,作为新创建的用户登录,请确保您在您的 root 目录中:

1cd ~

接下来,运行以下命令来注册 Microsoft 密钥和产品存储库:

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

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

1sudo dpkg -i packages-microsoft-prod.deb

为了方便安装您的应用程序所需的其他包,您将使用以下命令安装宇宙存储库:

1sudo add-apt-repository universe

接下来安装apt-transport包,允许使用通过 HTTP 安全协议访问的存储库:

1sudo apt install apt-transport-https

现在,运行以下命令,从存储库下载包列表,并更新它们,以获取有关包的最新版本及其依赖的信息:

1sudo apt update

最后,您可以安装.NET 运行时 SDK:

1sudo apt install dotnet-sdk-2.2

您将被提示与额外的文件大小的细节将被安装. 输入Y并按ENTER继续。

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

第2步:创建一个MySQL用户和数据库

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

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

1mysql -u root -p

您将被要求输入根帐户密码,在前提教程中设置。

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

1CREATE DATABASE MovieAppDb;

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

1[secondary_label Output]
2Query OK, 1 row affected (0.03 sec)

接下来,您将创建一个新的MySQL用户,将其与新创建的数据库相关联,并授予所有特权。

运行以下命令创建 MySQL 用户名和密码. 请记住将用户名和密码更改为更安全的东西:

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

您将看到以下结果:

1[secondary_label Output]
2Query OK, 0 rows affected (0.02 sec)

要访问数据库或对其执行特定操作,MySQL用户需要适当的权限。

您将通过运行以下命令来更改在MovieAppDb上的 movie-admin :

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

您将看到以下结果:

1[secondary_label Output]
2Query OK, 0 rows affected (0.01 sec)

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

1FLUSH PRIVILEGES;

您将看到以下结果:

1[secondary_label Output]
2Query OK, 0 rows affected (0.00 sec)

您已完成创建新用户并授予权限. 要测试您是否在轨道上,请退出 MySQL 客户端:

1quit;

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

1mysql -u movie-admin -p

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

1SHOW DATABASES;

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

1[secondary_label Output]
2+--------------------+
3| Database           |
4+--------------------+
5| MovieAppDb         |
6| information_schema |
7+--------------------+
82 rows in set (0.01 sec)

现在,离开MySQL客户端:

1quit;

您创建了一个数据库,为演示应用程序创建了一个新的MySQL用户,并授予新创建的用户正确的访问权限。

步骤 3 – 设置演示应用程序和数据库凭证

如前所言,你会部署一个现有的ASP. 净额 核心应用. 这个应用程序是用来创建电影列表的,它采用了Model-View-Captain设计模式,以确保适当的结构以及关注的分离. 要创建或添加到列表中的新电影,用户会将表格字段填入适当的细节并点击Create 按钮将细节发布到控制器. 此时控制器将接收POST HTTP请求,并附上所提交的细节,并通过模型将数据库中的数据持续.

您将使用 GitGitHub提取此演示应用程序的源代码,并将其保存到新的目录中。 如果您正在部署不同的应用程序,您也可以在这里下载替代应用程序。

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

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

接下来,更改文件夹所有者和组,以允许非根用户帐户与项目文件工作:

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

用你的 sudo 非 root 用户名取代 sammy

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

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

您将看到以下结果:

1[secondary_label Output]
2Cloning into 'movie-app'...
3remote: Enumerating objects: 91, done.
4remote: Counting objects: 100% (91/91), done.
5remote: Compressing objects: 100% (73/73), done.
6remote: Total 91 (delta 13), reused 91 (delta 13), pack-reused 0
7Unpacking objects: 100% (91/91), done.

您已经成功地从 GitHub 克隆了演示应用程序,所以下一步将是创建一个成功的连接到应用程序数据库. 您将通过编辑ConnectionStrings属性在appsettings.json文件中,并添加数据库的详细信息来做到这一点。

在应用程序中更改目录:

1cd movie-app

现在打开文件来编辑:

1sudo nano appsettings.json

添加您的数据库凭证:

 1[label appsettings.json]
 2{
 3  "Logging": {
 4    "LogLevel": {
 5      "Default": "Warning"
 6    }
 7  },
 8  "AllowedHosts": "*",
 9  "ConnectionStrings": {
10    "MovieContext": "Server=localhost;User Id=movie-admin;Password=password;Database=MovieAppDb"
11  }
12}

有了这个,您已经成功连接到您的数据库。现在按CTRL+X来保存您的更改,然后键入Y来确认。

ASP.NET Core 应用程序使用一个名为 Entity Framework(EF)核心的.NET 标准库来管理与数据库的交互。 Entity Framework Core是流行的 Entity Framework 数据访问技术的轻量级、跨平台版本。 它是一种对象关系地图器(ORM),允许.NET 开发人员使用任何数据库提供商(如 MySQL)与数据库一起工作。

您现在可以用克隆的演示应用程序的表来更新您的数据库。

1dotnet ef database update

这将应用更新到数据库并创建相应的方案。

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

1dotnet build

你会看到类似的输出:

 1[secondary_label Output]
 2Microsoft (R) Build Engine version 16.1.76+g14b0a930a7 for .NET Core
 3Copyright (C) Microsoft Corporation. All rights reserved.
 4
 5  Restore completed in 95.09 ms for /var/www/movie-app/MvcMovie.csproj.
 6  MvcMovie -> /var/www/movie-app/bin/Debug/netcoreapp2.2/MvcMovie.dll
 7  MvcMovie -> /var/www/movie-app/bin/Debug/netcoreapp2.2/MvcMovie.Views.dll
 8
 9Build succeeded.
10    0 Warning(s)
11    0 Error(s)
12
13Time Elapsed 00:00:01.91

这将构建该项目并安装在project.assets.json文件中列出的任何第三方依赖,但应用程序尚未准备好生产。

1dotnet publish

你会看到以下:

1[secondary_label Output]
2Microsoft (R) Build Engine version 16.1.76+g14b0a930a7 for .NET Core
3Copyright (C) Microsoft Corporation. All rights reserved.
4
5Restore completed in 89.62 ms for /var/www/movie-app/MvcMovie.csproj.
6MvcMovie -> /var/www/movie-app/bin/Debug/netcoreapp2.2/MvcMovie.dll
7MvcMovie -> /var/www/movie-app/bin/Debug/netcoreapp2.2/MvcMovie.Views.dll
8MvcMovie -> /var/www/movie-app/bin/Debug/netcoreapp2.2/publish/

这将包装和编译应用程序,通过其依赖性读取,将结果的文件集发布到部署的文件夹中,并生成一个跨平台 .dll 文件,该文件使用安装的.NET Core 运行时间来运行应用程序。

通过安装依赖性,创建连接到数据库,更新数据库与必要的表,并发布它生产,你已经完成了这个演示应用程序的设置。

第4步:配置 Web 服务器

现在,在遵循了)之后,您将在/etc/nginx/sites-captive/your_domain中为您的域设置一个服务器块,并使用已经适当设置的server_name指令。 在此步骤中, 您将编辑此服务器块以配置 Nginx 作为您的应用程序的倒置代理 。 一个反向代理是一个服务器,它坐在网页服务器前,将每个网页浏览器的请求转发给这些网页服务器. 它接收来自网络的所有请求并转发到不同的网络服务器.

在ASP的情况下. 净额 Core application, Kestrel 是默认包含其中的首选网络服务器. 它对于服务于ASP的动态内容是巨大的. 净额 核心应用程序,因为它能提供更好的请求处理性能,并且旨在制作ASP. NET尽可能快. 然而,Kestrel并不被认为是一个全功能的网络服务器,因为它无法管理安全并服务于静态文件,因此最好总是在网络服务器后运行.

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

1cd ~

打开服务器块以编辑:

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

如在 步骤 4How To Secure Nginx with Let's Encrypt 教程,如果您选择了选项2,Certbot将自动配置此服务器块,以重定向HTTP流量到HTTPS,仅有几个修改。

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

 1[label  /etc/nginx/sites-available/your-domain]
 2server {
 3
 4    server_name your-domain www.your-domain;
 5
 6   location / {
 7     proxy_pass http://localhost:5000;
 8     proxy_http_version 1.1;
 9     proxy_set_header Upgrade $http_upgrade;
10     proxy_set_header Connection keep-alive;
11     proxy_set_header Host $host;
12     proxy_cache_bypass $http_upgrade;
13     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
14     proxy_set_header X-Forwarded-Proto $scheme;
15    }
16
17listen [::]:443 ssl ipv6only=on; # managed by Certbot
18listen 443 ssl; # managed by Certbot
19ssl_certificate /etc/letsencrypt/live/your-domain/fullchain.pem; # managed by Certbot
20ssl_certificate_key /etc/letsencrypt/live/your-domain/privkey.pem; # managed by Certbot
21include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
22ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
23
24}
25...

此服务器块中的配置将指示 Nginx 倾听端口 443,这是使用 SSL 的网站的标准端口。 此外, Nginx 将接受端口 443上的公共流量,并将每一个匹配的请求发送到内置的 Kestrel 服务器上。

最后,按照您刚刚在文件中编辑的服务器块,确保第二个服务器块看起来像这样:

 1[label  /etc/nginx/sites-available/your-domain]
 2
 3...
 4server {
 5if ($host = www.your-domain) {
 6    return 301 https://$host$request_uri;
 7} # managed by Certbot
 8
 9if ($host = your-domain) {
10    return 301 https://$host$request_uri;
11} # managed by Certbot
12
13    listen 80;
14    listen [::]:80;
15
16    server_name your-domain www.your-domain;
17return 404; # managed by Certbot
18}

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

接下来,强迫 Nginx 通过运行来收集您对服务器块所做的更改:

1sudo nginx -s reload

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

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

进入系统目录:

1cd /etc/systemd/systems

创建一个新的文件来编辑:

1sudo nano movie.service

向它添加以下内容:

 1[label movie.service]
 2[Unit]
 3Description=Movie app
 4
 5[Service]
 6WorkingDirectory=/var/www/movie-app
 7ExecStart=/usr/bin/dotnet /var/www/movie-app/bin/Debug/netcoreapp2.2/publish/MvcMovie.dll
 8Restart=always
 9RestartSec=10
10SyslogIdentifier=movie
11User=sammy
12Environment=ASPNETCORE_ENVIRONMENT=Production
13Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
14
15[Install]
16WantedBy=multi-user.target

配置文件指定了项目文件夹的位置,其中包含了WorkingDirectory和在ExecStart中开始过程时要执行的命令,此外,您还使用了RestartSec指令来指定如果.NET 运行时间服务故障,何时重新启动systemd服务。

现在保存文件,并启用新的电影服务创建与:

1sudo systemctl enable movie.service

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

1sudo systemctl start movie.service

然后检查它的状态:

1sudo systemctl status movie.service

您将看到以下结果:

1[secondary_label Output]
2movie.service - Movie app
3   Loaded: loaded (/etc/systemd/system/movie.service; enabled; vendor preset: enabled)
4   Active: active (running) since Sun 2019-06-23 04:51:28 UTC; 11s ago
5 Main PID: 6038 (dotnet)
6    Tasks: 16 (limit: 1152)
7   CGroup: /system.slice/movie.service
8           └─6038 /usr/bin/dotnet /var/www/movie-app/bin/Debug/netcoreapp2.2/publish/MvcMovie.dll

此输出为您提供创建以保持应用程序运行的movie.service的当前状态的概述,表明该服务已启用并目前处于活动状态。

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

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

Movie list application

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

结论

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

除了本教程之外,如果您有兴趣使用C# 而不是JavaScript构建交互式Web应用程序,您可以尝试微软的Web UI框架,名为Blazor(https://dotnet.microsoft.com/apps/aspnet/web-apps/client)。

如果你想部署自己的应用程序,你需要考虑其他必要的程序来部署你的应用程序. 这个演示应用程序的完整源代码可以找到 这里在GitHub

Published At
Categories with 技术
comments powered by Disqus