65.9K
CodeProject 正在变化。 阅读更多。
Home

将 Blazor 服务器端部署到 Ubuntu Linux 发行版。

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2020 年 6 月 3 日

CPOL

5分钟阅读

viewsIcon

32295

将 Blazor 服务器端应用程序部署到现有 Linux 发行版 Ubuntu 安装的分步过程。

引言

本文是关于如何在 Ubuntu Linux 上运行 Blazor 服务器端 Web 应用程序的分步指南。

该系列中的另一篇文章,您可以根据自己的需求使用:

安装说明(初学者详细说明)

对于不希望获得详细说明的用户,文章末尾有一个摘要,其中仅列出了文章中使用的所有命令,而没有输出。

文章的编写方式旨在消除任何关于使用哪些命令的疑问,并以详细的分步方式进行。输出列表适用于那些遇到错误并希望查看正常工作输出(如我的)应该是什么样子的人。

首先,请确保安装了最新版本的 Ubuntu。从您喜欢的终端命令行,按列出的顺序键入以下命令。

第一步是检查您使用的 Ubuntu 版本

akshays@CodeProjectUbuntu:~$ lsb_release -a
No LSB modules are available.
Distributor ID:    Ubuntu
Description:    Ubuntu 20.04 LTS
Release:    20.04
Codename:    focal

我使用的是 20.04 版本。因此,请访问 *packages.microsoft.com/config/ubuntu*。检查是否有包含您版本的目录。然后检查目录中名为 *packages-microsoft-prod.deb* 的文件。因此,在我撰写本文时,请运行以下命令:

akshays@CodeProjectUbuntu:~$ wget 
-q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb 
-O packages-microsoft-prod.deb

使用以下命令检查文件是否已下载

akshays@CodeProjectUbuntu:~$ ls
Desktop  Documents  Downloads  Music  packages-microsoft-prod.deb  
Pictures  Public  snap  Templates  Videos

现在使用以下命令安装软件包

akshays@CodeProjectUbuntu:~$ sudo dpkg -i packages-microsoft-prod.deb
Selecting previously unselected package packages-microsoft-prod.
(Reading database ... 184434 files and directories currently installed.)
Preparing to unpack packages-microsoft-prod.deb ...
Unpacking packages-microsoft-prod (1.0-ubuntu20.04.1) ...
Setting up packages-microsoft-prod (1.0-ubuntu20.04.1) ...

下一步是更新软件包

akshays@CodeProjectUbuntu:~$ sudo apt-get update
Get:1 http://security.ubuntu.com/ubuntu focal-security InRelease [107 kB]
Hit:2 http://in.archive.ubuntu.com/ubuntu focal InRelease          
Hit:3 http://in.archive.ubuntu.com/ubuntu focal-updates InRelease                    
Hit:4 http://in.archive.ubuntu.com/ubuntu focal-backports InRelease                
Get:5 https://packages.microsoft.com/ubuntu/20.04/prod focal InRelease [10.5 kB]          
Get:6 https://packages.microsoft.com/ubuntu/20.04/prod focal/main amd64 Packages [6,506 B]
Fetched 124 kB in 2s (72.0 kB/s)    
Reading package lists... Done

如果您正在使用 SSL(安全套接字层)HTTPS,请执行以下操作:

akshays@CodeProjectUbuntu:~$ sudo apt-get install apt-transport-https
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  apt-transport-https
0 upgraded, 1 newly installed, 0 to remove and 40 not upgraded.
Need to get 1,708 B of archives.
After this operation, 160 kB of additional disk space will be used.
Get:1 http://in.archive.ubuntu.com/ubuntu focal-updates/universe amd64 
apt-transport-https all 2.0.2ubuntu0.1 [1,708 B]
Fetched 1,708 B in 0s (45.9 kB/s)              
Selecting previously unselected package apt-transport-https.
(Reading database ... 184442 files and directories currently installed.)
Preparing to unpack .../apt-transport-https_2.0.2ubuntu0.1_all.deb ...
Unpacking apt-transport-https (2.0.2ubuntu0.1) ...
Setting up apt-transport-https (2.0.2ubuntu0.1) ...

接下来,安装 .NET Core SDK

akshays@CodeProjectUbuntu:~$ sudo apt-get install dotnet-sdk-3.1
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  aspnetcore-runtime-3.1 aspnetcore-targeting-pack-3.1 dotnet-apphost-pack-3.1 
  dotnet-host dotnet-hostfxr-3.1 dotnet-runtime-3.1 dotnet-runtime-deps-3.1
  dotnet-targeting-pack-3.1 netstandard-targeting-pack-2.1
The following NEW packages will be installed:
  aspnetcore-runtime-3.1 aspnetcore-targeting-pack-3.1 dotnet-apphost-pack-3.1 
  dotnet-host dotnet-hostfxr-3.1 dotnet-runtime-3.1 dotnet-runtime-deps-3.1
  dotnet-sdk-3.1 dotnet-targeting-pack-3.1 netstandard-targeting-pack-2.1
0 upgraded, 10 newly installed, 0 to remove and 40 not upgraded.
Need to get 78.7 MB of archives.
After this operation, 337 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 https://packages.microsoft.com/ubuntu/20.04/prod focal/main 
      amd64 dotnet-host amd64 3.1.4-1 [32.9 kB]
Get:2 https://packages.microsoft.com/ubuntu/20.04/prod focal/main 
      amd64 dotnet-hostfxr-3.1 amd64 3.1.4-1 [121 kB]
Get:3 https://packages.microsoft.com/ubuntu/20.04/prod focal/main 
      amd64 dotnet-runtime-deps-3.1 amd64 3.1.4-1 [2,668 B]
Get:4 https://packages.microsoft.com/ubuntu/20.04/prod focal/main 
      amd64 dotnet-runtime-3.1 amd64 3.1.4-1 [21.8 MB]
Get:5 https://packages.microsoft.com/ubuntu/20.04/prod focal/main 
      amd64 aspnetcore-runtime-3.1 amd64 3.1.4-1 [5,762 kB]
Get:6 https://packages.microsoft.com/ubuntu/20.04/prod focal/main 
      amd64 dotnet-targeting-pack-3.1 amd64 3.1.0-1 [1,988 kB]
Get:7 https://packages.microsoft.com/ubuntu/20.04/prod focal/main 
      amd64 aspnetcore-targeting-pack-3.1 amd64 3.1.3-1 [949 kB]
Get:8 https://packages.microsoft.com/ubuntu/20.04/prod focal/main 
      amd64 dotnet-apphost-pack-3.1 amd64 3.1.4-1 [42.5 kB]
Get:9 https://packages.microsoft.com/ubuntu/20.04/prod focal/main 
      amd64 netstandard-targeting-pack-2.1 amd64 2.1.0-1 [1,474 kB]
Get:10 https://packages.microsoft.com/ubuntu/20.04/prod focal/main 
       amd64 dotnet-sdk-3.1 amd64 3.1.300-1 [46.5 MB]
Fetched 78.7 MB in 16s (5,012 kB/s)
Selecting previously unselected package dotnet-host.
(Reading database ... 184446 files and directories currently installed.)
Preparing to unpack .../0-dotnet-host_3.1.4-1_amd64.deb ...
Unpacking dotnet-host (3.1.4-1) ...
Selecting previously unselected package dotnet-hostfxr-3.1.
Preparing to unpack .../1-dotnet-hostfxr-3.1_3.1.4-1_amd64.deb ...
Unpacking dotnet-hostfxr-3.1 (3.1.4-1) ...
Selecting previously unselected package dotnet-runtime-deps-3.1.
Preparing to unpack .../2-dotnet-runtime-deps-3.1_3.1.4-1_amd64.deb ...
Unpacking dotnet-runtime-deps-3.1 (3.1.4-1) ...
Selecting previously unselected package dotnet-runtime-3.1.
Preparing to unpack .../3-dotnet-runtime-3.1_3.1.4-1_amd64.deb ...
Unpacking dotnet-runtime-3.1 (3.1.4-1) ...
Selecting previously unselected package aspnetcore-runtime-3.1.
Preparing to unpack .../4-aspnetcore-runtime-3.1_3.1.4-1_amd64.deb ...
Unpacking aspnetcore-runtime-3.1 (3.1.4-1) ...
Selecting previously unselected package dotnet-targeting-pack-3.1.
Preparing to unpack .../5-dotnet-targeting-pack-3.1_3.1.0-1_amd64.deb ...
Unpacking dotnet-targeting-pack-3.1 (3.1.0-1) ...
Selecting previously unselected package aspnetcore-targeting-pack-3.1.
Preparing to unpack .../6-aspnetcore-targeting-pack-3.1_3.1.3-1_amd64.deb ...
Unpacking aspnetcore-targeting-pack-3.1 (3.1.3-1) ...
Selecting previously unselected package dotnet-apphost-pack-3.1.
Preparing to unpack .../7-dotnet-apphost-pack-3.1_3.1.4-1_amd64.deb ...
Unpacking dotnet-apphost-pack-3.1 (3.1.4-1) ...
Selecting previously unselected package netstandard-targeting-pack-2.1.
Preparing to unpack .../8-netstandard-targeting-pack-2.1_2.1.0-1_amd64.deb ...
Unpacking netstandard-targeting-pack-2.1 (2.1.0-1) ...
Selecting previously unselected package dotnet-sdk-3.1.
Preparing to unpack .../9-dotnet-sdk-3.1_3.1.300-1_amd64.deb ...
Unpacking dotnet-sdk-3.1 (3.1.300-1) ...
Setting up dotnet-host (3.1.4-1) ...
Setting up dotnet-apphost-pack-3.1 (3.1.4-1) ...
Setting up netstandard-targeting-pack-2.1 (2.1.0-1) ...
Setting up dotnet-targeting-pack-3.1 (3.1.0-1) ...
Setting up aspnetcore-targeting-pack-3.1 (3.1.3-1) ...
Setting up dotnet-runtime-deps-3.1 (3.1.4-1) ...
Setting up dotnet-hostfxr-3.1 (3.1.4-1) ...
Setting up dotnet-runtime-3.1 (3.1.4-1) ...
Setting up aspnetcore-runtime-3.1 (3.1.4-1) ...
Setting up dotnet-sdk-3.1 (3.1.300-1) ...
This software may collect information about you and your use of the software, 
and send that to Microsoft.
Please visit http://aka.ms/dotnet-cli-eula for more information.
Welcome to .NET Core!
---------------------
Learn more about .NET Core: https://aka.ms/dotnet-docs
Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs

Telemetry
---------
The .NET Core tools collect usage data in order to help us improve your experience. 
The data is anonymous and doesn't include command-line arguments. 
The data is collected by Microsoft and shared with the community. 
You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT 
environment variable to '1' or 'true' using your favorite shell.

Read more about .NET Core CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry

Configuring...
--------------
A command is running to populate your local package cache to improve 
restore speed and enable offline access. This command takes up to one minute 
to complete and only runs once.
Processing triggers for man-db (2.9.1-1) ...

然后,以防万一,再次更新软件包

akshays@CodeProjectUbuntu:~$ sudo apt-get update
Hit:1 http://in.archive.ubuntu.com/ubuntu focal InRelease
Hit:2 http://in.archive.ubuntu.com/ubuntu focal-updates InRelease            
Hit:3 http://in.archive.ubuntu.com/ubuntu focal-backports InRelease          
Get:4 http://security.ubuntu.com/ubuntu focal-security InRelease [107 kB]
Hit:5 https://packages.microsoft.com/ubuntu/20.04/prod focal InRelease         
Fetched 107 kB in 2s (63.1 kB/s)                         
Reading package lists... Done

如果您不想要 .NET Core SDK,但只想要运行时,请检查最新版本的 .NET Core 运行时,以我的情况为例,它是 3.1,然后运行以下命令:

akshays@CodeProjectUbuntu:~$ sudo apt-get install aspnetcore-runtime-3.1

使用以下命令检查您的 .NET Core 版本

akshays@CodeProjectUbuntu:~$ dotnet --version
3.1.300

访问以下 URL,并检查您是否获得了最新的 .NET Core 版本,包括安全更新:

现在安装 Nginx(Web 服务器),用于托管您的 Blazor 服务器端 Web 应用程序

akshays@CodeProjectUbuntu:~$ sudo apt-get install nginx
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  libnginx-mod-http-image-filter libnginx-mod-http-xslt-filter 
  libnginx-mod-mail libnginx-mod-stream nginx-common nginx-core
Suggested packages:
  fcgiwrap nginx-doc
The following NEW packages will be installed:
  libnginx-mod-http-image-filter libnginx-mod-http-xslt-filter 
  libnginx-mod-mail libnginx-mod-stream nginx nginx-common nginx-core
0 upgraded, 7 newly installed, 0 to remove and 40 not upgraded.
Need to get 602 kB of archives.
After this operation, 2,134 kB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://in.archive.ubuntu.com/ubuntu focal/main amd64 
nginx-common all 1.17.10-0ubuntu1 [37.3 kB]
Get:2 http://in.archive.ubuntu.com/ubuntu focal/main amd64 
libnginx-mod-http-image-filter amd64 1.17.10-0ubuntu1 [14.3 kB]
Get:3 http://in.archive.ubuntu.com/ubuntu focal/main amd64 
libnginx-mod-http-xslt-filter amd64 1.17.10-0ubuntu1 [12.5 kB]
Get:4 http://in.archive.ubuntu.com/ubuntu focal/main amd64 
libnginx-mod-mail amd64 1.17.10-0ubuntu1 [42.3 kB]
Get:5 http://in.archive.ubuntu.com/ubuntu focal/main amd64 
libnginx-mod-stream amd64 1.17.10-0ubuntu1 [66.9 kB]
Get:6 http://in.archive.ubuntu.com/ubuntu focal/main amd64 
nginx-core amd64 1.17.10-0ubuntu1 [425 kB]
Get:7 http://in.archive.ubuntu.com/ubuntu focal/main amd64 
nginx all 1.17.10-0ubuntu1 [3,616 B]
Fetched 602 kB in 0s (1,662 kB/s)
Preconfiguring packages ...
Selecting previously unselected package nginx-common.
(Reading database ... 187228 files and directories currently installed.)
Preparing to unpack .../0-nginx-common_1.17.10-0ubuntu1_all.deb ...
Unpacking nginx-common (1.17.10-0ubuntu1) ...
Selecting previously unselected package libnginx-mod-http-image-filter.
Preparing to unpack .../1-libnginx-mod-http-image-filter_1.17.10-0ubuntu1_amd64.deb ...
Unpacking libnginx-mod-http-image-filter (1.17.10-0ubuntu1) ...
Selecting previously unselected package libnginx-mod-http-xslt-filter.
Preparing to unpack .../2-libnginx-mod-http-xslt-filter_1.17.10-0ubuntu1_amd64.deb ...
Unpacking libnginx-mod-http-xslt-filter (1.17.10-0ubuntu1) ...
Selecting previously unselected package libnginx-mod-mail.
Preparing to unpack .../3-libnginx-mod-mail_1.17.10-0ubuntu1_amd64.deb ...
Unpacking libnginx-mod-mail (1.17.10-0ubuntu1) ...
Selecting previously unselected package libnginx-mod-stream.
Preparing to unpack .../4-libnginx-mod-stream_1.17.10-0ubuntu1_amd64.deb ...
Unpacking libnginx-mod-stream (1.17.10-0ubuntu1) ...
Selecting previously unselected package nginx-core.
Preparing to unpack .../5-nginx-core_1.17.10-0ubuntu1_amd64.deb ...
Unpacking nginx-core (1.17.10-0ubuntu1) ...
Selecting previously unselected package nginx.
Preparing to unpack .../6-nginx_1.17.10-0ubuntu1_all.deb ...
Unpacking nginx (1.17.10-0ubuntu1) ...
Setting up nginx-common (1.17.10-0ubuntu1) ...
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → 
/lib/systemd/system/nginx.service.
Setting up libnginx-mod-http-xslt-filter (1.17.10-0ubuntu1) ...
Setting up libnginx-mod-mail (1.17.10-0ubuntu1) ...
Setting up libnginx-mod-http-image-filter (1.17.10-0ubuntu1) ...
Setting up libnginx-mod-stream (1.17.10-0ubuntu1) ...
Setting up nginx-core (1.17.10-0ubuntu1) ...
Setting up nginx (1.17.10-0ubuntu1) ...
Processing triggers for systemd (245.4-4ubuntu3.1) ...
Processing triggers for man-db (2.9.1-1) ...
Processing triggers for ufw (0.36-6) ...

现在启动 Nginx Web 服务器服务

akshays@CodeProjectUbuntu:~$ sudo service nginx start

现在,通过在您选择的 Web 浏览器中访问以下 URL,测试 Nginx Web 服务器是否正常工作,方法是显示其默认安装的网页:

http://codeprojectubuntu/index.nginx-debian.html

或者

localhost/index.nginx-debian.html

您应该会在 Web 浏览器中看到 Nginx 欢迎网页。现在我们已经正确安装并确认 Nginx 工作正常,让我们配置 Nginx 代理。第一步是转到配置文件目录,该目录位于 *etc*。然后列出目录中的文件,您将找到一个默认配置文件。

akshays@CodeProjectUbuntu:~$ cd /etc/nginx/sites-available/
akshays@CodeProjectUbuntu:/etc/nginx/sites-available$ ls
default

现在编辑默认配置文件,以便在 location 块中为您的 .NET Core Blazor 服务器端 Web 应用程序进行代理设置,如下所示:

        location / {
                proxy_pass https://: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;
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }

我使用的是 90 年代左右的 joe 终端文本编辑器,它基于 libcurses,因此比 vi 等更容易使用。我过去曾用它制作了一些小型视频游戏来娱乐。它在 Ubuntu 上并非默认安装,因此您需要运行以下命令来安装它:

akshays@CodeProjectUbuntu:/etc/nginx/sites-available$ sudo apt install joe

现在返回您的 *home* 目录或您想要安装 Blazor 服务器端 Web 应用程序的任何位置,并将所有文件复制到那里。

出于演示目的,我将使用我的 Github 公共存储库和 Blazor 服务器端应用程序,这是本系列“如何尽可能详细地学习 Blazor 服务器端”的一部分。请记住,Blazor 是一项不断变化的新技术。现在我将执行以下命令:

akshays@CodeProjectUbuntu:/etc/nginx/sites-available$ cd ~
akshays@CodeProjectUbuntu:~$ mkdir BlazorCanvasApp
akshays@CodeProjectUbuntu:~$ cd BlazorCanvasApp/
akshays@CodeProjectUbuntu:~/BlazorCanvasApp$ 
wget https://github.com/akshays2112/BlazorCanvasApp/zipball/master/ -O BlazorCanvasApp.zip
--2020-06-03 16:55:39--  https://github.com/akshays2112/BlazorCanvasApp/zipball/master/
Resolving github.com (github.com)... 13.234.176.102
Connecting to github.com (github.com)|13.234.176.102|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://codeload.github.com/akshays2112/BlazorCanvasApp/legacy.zip/master [following]
--2020-06-03 16:55:39--  
https://codeload.github.com/akshays2112/BlazorCanvasApp/legacy.zip/master
Resolving codeload.github.com (codeload.github.com)... 13.127.152.42
Connecting to codeload.github.com (codeload.github.com)|13.127.152.42|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [application/zip]
Saving to: ‘BlazorCanvasApp.zip’

BlazorCanvasApp.zip
[ <=>
] 229.32K  --.-KB/s    in 0.05s   

2020-06-03 16:55:40 (4.61 MB/s) - ‘BlazorCanvasApp.zip’ saved [234826]

akshays@CodeProjectUbuntu:~/BlazorCanvasApp$ unzip BlazorCanvasApp.zip 
Archive:  BlazorCanvasApp.zip
fafb1f5a683a19d34ffbe01ec8b075fe7c7fe5d1
   creating: akshays2112-BlazorCanvasApp-fafb1f5/
  inflating: akshays2112-BlazorCanvasApp-fafb1f5/.gitattributes  
  inflating: akshays2112-BlazorCanvasApp-fafb1f5/.gitignore  
  inflating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp.sln  
   creating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/
  inflating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/App.razor  
  inflating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/BlazorCanvasApp.csproj  
   creating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/Data/
  inflating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/Data/WeatherForecast.cs  
  inflating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/Data/WeatherForecastService.cs  
   creating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/Pages/
  inflating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/Pages/CanvasDrawing.razor  
  inflating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/Pages/Counter.razor  
  inflating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/Pages/Error.razor  
  inflating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/Pages/FetchData.razor  
  inflating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/Pages/Index.razor  
  inflating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/Pages/_Host.cshtml  
  inflating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/Program.cs  
   creating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/Properties/
  inflating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/Properties/launchSettings.json  
   creating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/Shared/
  inflating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/Shared/MainLayout.razor  
  inflating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/Shared/NavMenu.razor  
  inflating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/Shared/SurveyPrompt.razor  
  inflating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/Startup.cs  
  inflating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/_Imports.razor  
  inflating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/appsettings.Development.json  
  inflating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/appsettings.json  
   creating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/wwwroot/
   creating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/wwwroot/css/
   creating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/wwwroot/css/bootstrap/
  inflating: akshays2112-BlazorCanvasApp-
  fafb1f5/BlazorCanvasApp/wwwroot/css/bootstrap/bootstrap.min.css  
  inflating: akshays2112-BlazorCanvasApp-
  fafb1f5/BlazorCanvasApp/wwwroot/css/bootstrap/bootstrap.min.css.map  
   creating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/wwwroot/css/open-iconic/
  inflating: akshays2112-BlazorCanvasApp-
  fafb1f5/BlazorCanvasApp/wwwroot/css/open-iconic/FONT-LICENSE  
  inflating: akshays2112-BlazorCanvasApp-
  fafb1f5/BlazorCanvasApp/wwwroot/css/open-iconic/ICON-LICENSE  
  inflating: akshays2112-BlazorCanvasApp-
  fafb1f5/BlazorCanvasApp/wwwroot/css/open-iconic/README.md  
   creating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/wwwroot/css/open-iconic/font/
   creating: akshays2112-BlazorCanvasApp-
  fafb1f5/BlazorCanvasApp/wwwroot/css/open-iconic/font/css/
  inflating: akshays2112-BlazorCanvasApp-
  fafb1f5/BlazorCanvasApp/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css  
   creating: akshays2112-BlazorCanvasApp-
  fafb1f5/BlazorCanvasApp/wwwroot/css/open-iconic/font/fonts/
  inflating: akshays2112-BlazorCanvasApp-
  fafb1f5/BlazorCanvasApp/wwwroot/css/open-iconic/font/fonts/open-iconic.eot  
  inflating: akshays2112-BlazorCanvasApp-
  fafb1f5/BlazorCanvasApp/wwwroot/css/open-iconic/font/fonts/open-iconic.otf  
  inflating: akshays2112-BlazorCanvasApp-
  fafb1f5/BlazorCanvasApp/wwwroot/css/open-iconic/font/fonts/open-iconic.svg  
  inflating: akshays2112-BlazorCanvasApp-
  fafb1f5/BlazorCanvasApp/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf  
  inflating: akshays2112-BlazorCanvasApp-
  fafb1f5/BlazorCanvasApp/wwwroot/css/open-iconic/font/fonts/open-iconic.woff  
  inflating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/wwwroot/css/site.css  
  inflating: akshays2112-BlazorCanvasApp-fafb1f5/BlazorCanvasApp/wwwroot/favicon.ico  
akshays@CodeProjectUbuntu:~/BlazorCanvasApp$ mv akshays2112-BlazorCanvasApp-fafb1f5/* ./
akshays@CodeProjectUbuntu:~/BlazorCanvasApp$ rm -rf akshays2112-BlazorCanvasApp-fafb1f5/
akshays@CodeProjectUbuntu:~/BlazorCanvasApp$ rm BlazorCanvasApp.zip 
akshays@CodeProjectUbuntu:~/BlazorCanvasApp$ ls
BlazorCanvasApp  BlazorCanvasApp.sln

下一步是使用以下命令编译 *BlazorCanvasApp.sln*:

akshays@CodeProjectUbuntu:~/BlazorCanvasApp$ dotnet build BlazorCanvasApp.sln -o ./release
Microsoft (R) Build Engine version 16.6.0+5ff7b0c9e for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

  Determining projects to restore...
  All projects are up-to-date for restore.
CSC : warning CS8034: Unable to load Analyzer assembly 
      /home/akshays/.nuget/packages/microsoft.aspnetcore.components.analyzers/
      3.0.0/analyzers/dotnet/cs/Microsoft.AspNetCore.Components.Analyzers.dll : 
      Assembly with same name is already loaded 
      [/home/akshays/BlazorCanvasApp/BlazorCanvasApp/BlazorCanvasApp.csproj]
CSC : warning CS8034: Unable to load Analyzer assembly 
      /home/akshays/.nuget/packages/microsoft.aspnetcore.components.analyzers/
      3.0.0/analyzers/dotnet/cs/Microsoft.AspNetCore.Components.Analyzers.dll : 
      Assembly with same name is already loaded [/home/akshays/BlazorCanvasApp/
      BlazorCanvasApp/BlazorCanvasApp.csproj]
  BlazorCanvasApp -> /home/akshays/BlazorCanvasApp/release/BlazorCanvasApp.dll
  BlazorCanvasApp -> /home/akshays/BlazorCanvasApp/release/BlazorCanvasApp.Views.dll

Build succeeded.

CSC : warning CS8034: Unable to load Analyzer assembly 
      /home/akshays/.nuget/packages/microsoft.aspnetcore.components.analyzers/
      3.0.0/analyzers/dotnet/cs/Microsoft.AspNetCore.Components.Analyzers.dll : 
      Assembly with same name is already loaded [/home/akshays/BlazorCanvasApp/
      BlazorCanvasApp/BlazorCanvasApp.csproj]
CSC : warning CS8034: Unable to load Analyzer assembly 
      /home/akshays/.nuget/packages/microsoft.aspnetcore.components.analyzers/
      3.0.0/analyzers/dotnet/cs/Microsoft.AspNetCore.Components.Analyzers.dll : 
      Assembly with same name is already loaded [/home/akshays/BlazorCanvasApp/
      BlazorCanvasApp/BlazorCanvasApp.csproj]
    2 Warning(s)
    0 Error(s)

Time Elapsed 00:00:06.32

我收到了一些警告,但它们是无害的。在我的情况下,它只是说 DLL 已加载,所以我可以忽略它。

现在进入 *release* 目录,您应该会看到所有 Blazor 服务器端应用程序文件,这些文件是编译器的输出。现在我们将通过运行 dotnet 命令来测试 Blazor 服务器端应用程序是否正常工作:

akshays@CodeProjectUbuntu:~/BlazorCanvasApp$ cd release/
akshays@CodeProjectUbuntu:~/BlazorCanvasApp/release$ ls
appsettings.Development.json  BlazorCanvasApp.deps.json  
   BlazorCanvasApp.runtimeconfig.dev.json  BlazorCanvasApp.Views.dll     
   Blazor.Extensions.Canvas.JS.dll
appsettings.json              BlazorCanvasApp.dll        
   BlazorCanvasApp.runtimeconfig.json      BlazorCanvasApp.Views.pdb     
   Newtonsoft.Json.dll
BlazorCanvasApp               BlazorCanvasApp.pdb        
   BlazorCanvasApp.StaticWebAssets.xml     Blazor.Extensions.Canvas.dll  Properties
akshays@CodeProjectUbuntu:~/BlazorCanvasApp/release$ dotnet BlazorCanvasApp.dll 
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
      No XML encryptor configured. Key {3b7a72a3-b5a0-4154-a804-573c1f365e97} 
      may be persisted to storage in unencrypted form.
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://:5000
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://:5001
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
      Content root path: /home/akshays/BlazorCanvasApp/release

现在 Blazor 服务器端 Web 应用程序正在运行,请打开您喜欢的 Web 浏览器并访问以下 URL:

https://:5000

您会发现格式丢失了,因为 *www* 文件夹缺失了。但是,Blazor 服务器端应用程序正在渲染并运行。您可以将 *www* 文件夹从开发计算机复制过来,它将包含所有 JavaScript 和 CSS 文件,然后它将像往常一样正确格式化。

您会发现 https://:5000/CanvasDrawing 会抛出错误。这是因为缺少支持 C# 中 Canvas 元素绘制的 NuGet 包的 JavaScript 文件。但就本文而言,只是演示在 Ubuntu 上运行 Blazor 服务器端的步骤,这对于使我的示例完全正常工作不是必需的。

现在进入最后一步,让 Nginx(Web 服务器)管理 Kestrel Blazor 服务器端 Web 应用程序。首先要做的是更改目录到 *etc* 路径,如下所述,并为 systemd 创建一个新的服务配置文件。在此之前,为了确保找到 dotnet 可执行文件的路径:

akshays@CodeProjectUbuntu:~/BlazorCanvasApp/release$ pwd
/home/akshays/BlazorCanvasApp/release
akshays@CodeProjectUbuntu:~/BlazorCanvasApp/release$ which dotnet
/usr/bin/dotnet
akshays@CodeProjectUbuntu:~/BlazorCanvasApp/release$ cd /etc/systemd/system/
akshays@CodeProjectUbuntu:/etc/systemd/system$ sudo joe kestrel-BlazorCanvasApp.service

将以下内容粘贴到 *kestrel-BlazorCanvasApp.service* 文件中:

[Unit]
Description=Blazor Server-side Canvas Drawing Demo
[Service]
WorkingDirectory=/home/akshays/BlazorCanvasApp/release
ExecStart=/usr/bin/dotnet /home/akshays/BlazorCanvasApp/release/BlazorCanvasApp.dll
Restart=always
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=BlazorCanvasApp
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target

现在通过键入以下命令向 systemd 注册新服务:

akshays@CodeProjectUbuntu:~/BlazorCanvasApp/release$ 
sudo systemctl enable kestrel-BlazorCanvasApp.service 
[sudo] password for akshays: 
Created symlink /etc/systemd/system/multi-user.target.wants/
kestrel-BlazorCanvasApp.service → /etc/systemd/system/kestrel-BlazorCanvasApp.service.

现在启动 kestrel-BlazorCanvasApp 服务并检查其状态,以确保它正在运行:

akshays@CodeProjectUbuntu:~/BlazorCanvasApp/release$ 
sudo systemctl start kestrel-BlazorCanvasApp.service 
akshays@CodeProjectUbuntu:~/BlazorCanvasApp/release$ 
sudo systemctl status kestrel-BlazorCanvasApp.service 
● kestrel-BlazorCanvasApp.service - Blazor Server-side Canvas Drawing Demo
     Loaded: loaded (/etc/systemd/system/kestrel-BlazorCanvasApp.service; 
     enabled; vendor preset: enabled)
     Active: active (running) since Wed 2020-06-03 18:19:45 IST; 43s ago
   Main PID: 12990 (dotnet)
      Tasks: 19 (limit: 9488)
     Memory: 26.5M
     CGroup: /system.slice/kestrel-BlazorCanvasApp.service
             └─12990 /usr/bin/dotnet /home/akshays/BlazorCanvasApp/release/BlazorCanvasApp.dll

Jun 03 18:19:45 CodeProjectUbuntu BlazorCanvasApp[12990]: 
       warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
Jun 03 18:19:45 CodeProjectUbuntu BlazorCanvasApp[12990]:       
       No XML encryptor configured. 
       Key {4875ffce-1bb9-40a6-a090-41dd899afa42} may be persisted to storage>
Jun 03 18:19:45 CodeProjectUbuntu BlazorCanvasApp[12990]: info: Microsoft.Hosting.Lifetime[0]
Jun 03 18:19:45 CodeProjectUbuntu BlazorCanvasApp[12990]:       
                Now listening on: https://:5000
Jun 03 18:19:45 CodeProjectUbuntu BlazorCanvasApp[12990]: info: Microsoft.Hosting.Lifetime[0]
Jun 03 18:19:45 CodeProjectUbuntu BlazorCanvasApp[12990]:       
                Application started. Press Ctrl+C to shut down.
Jun 03 18:19:45 CodeProjectUbuntu BlazorCanvasApp[12990]: info: Microsoft.Hosting.Lifetime[0]
Jun 03 18:19:45 CodeProjectUbuntu BlazorCanvasApp[12990]:       
                Hosting environment: Production
Jun 03 18:19:45 CodeProjectUbuntu BlazorCanvasApp[12990]: info: Microsoft.Hosting.Lifetime[0]
Jun 03 18:19:45 CodeProjectUbuntu BlazorCanvasApp[12990]:       
                Content root path: /home/akshays/BlazorCanvasApp/release

现在打开多个 Web 浏览器并访问以下 URL。您可以检查 */counter* 页面,它是真正多用户的,当您点击 **Click Me** 按钮时,不同浏览器副本上的不同网页中的计数器会以不同的方式递增:

https://:5000/counter

这就是整个分步过程。您现在可以在 Ubuntu 上部署任意数量的 Blazor 服务器端应用程序了。

所有命令摘要

以下是需要按顺序运行的所有命令,不带任何输出。这适用于那些已经知道所有 Ubuntu/Linux 命令并且只是想快速使用它们的人。

akshays@CodeProjectUbuntu:~$ wget 
-q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb 
-O packages-microsoft-prod.deb
akshays@CodeProjectUbuntu:~$ sudo dpkg -i packages-microsoft-prod.deb
akshays@CodeProjectUbuntu:~$ sudo apt-get update
akshays@CodeProjectUbuntu:~$ sudo apt-get install apt-transport-https

------------------ Choice Here -----------------------------------
akshays@CodeProjectUbuntu:~$ sudo apt-get install dotnet-sdk-3.1
--OR--------------------------------------------------------------
akshays@CodeProjectUbuntu:~$ sudo apt-get install aspnetcore-runtime-3.1\
------------------- End Choice -----------------------------------

akshays@CodeProjectUbuntu:~$ sudo apt-get update
akshays@CodeProjectUbuntu:~$ sudo apt-get install nginx
akshays@CodeProjectUbuntu:~$ sudo service nginx start

-------------------- Edit /etc/nginx/sites-available/default with this text -------
        location / {
                proxy_pass https://: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;
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }
------------------------------- End Text -------------------------------------------

akshays@CodeProjectUbuntu:/etc/nginx/sites-available$ cd ~
akshays@CodeProjectUbuntu:~$ mkdir BlazorCanvasApp
akshays@CodeProjectUbuntu:~$ cd BlazorCanvasApp/
akshays@CodeProjectUbuntu:~/BlazorCanvasApp$ 
wget https://github.com/akshays2112/BlazorCanvasApp/zipball/master/ -O BlazorCanvasApp.zip
akshays@CodeProjectUbuntu:~/BlazorCanvasApp$ unzip BlazorCanvasApp.zip 
akshays@CodeProjectUbuntu:~/BlazorCanvasApp$ mv akshays2112-BlazorCanvasApp-fafb1f5/* ./
akshays@CodeProjectUbuntu:~/BlazorCanvasApp$ rm -rf akshays2112-BlazorCanvasApp-fafb1f5/
akshays@CodeProjectUbuntu:~/BlazorCanvasApp$ rm BlazorCanvasApp.zip 
akshays@CodeProjectUbuntu:~/BlazorCanvasApp$ dotnet build BlazorCanvasApp.sln -o ./release
akshays@CodeProjectUbuntu:~/BlazorCanvasApp$ cd release/
akshays@CodeProjectUbuntu:~/BlazorCanvasApp/release$ dotnet BlazorCanvasApp.dll 

--------------------- New file /etc/systemd/system/kestrel-BlazorCanvasApp.service 
with following text -----
[Unit]
Description=Blazor Server-side Canvas Drawing Demo
[Service]
WorkingDirectory=/home/akshays/BlazorCanvasApp/release
ExecStart=/usr/bin/dotnet /home/akshays/BlazorCanvasApp/release/BlazorCanvasApp.dll
Restart=always
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=BlazorCanvasApp
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target
---------------------- End Text ---------------------------------------------------------------

akshays@CodeProjectUbuntu:~/BlazorCanvasApp/release$ 
sudo systemctl enable kestrel-BlazorCanvasApp.service 
akshays@CodeProjectUbuntu:~/BlazorCanvasApp/release$ 
sudo systemctl start kestrel-BlazorCanvasApp.service 
akshays@CodeProjectUbuntu:~/BlazorCanvasApp/release$ 
sudo systemctl status kestrel-BlazorCanvasApp.service 

历史

  • 2020 年 6 月 3 日:初始版本
© . All rights reserved.