一、在虚拟机Linux部署.NET Core项目-文字核心概要

先来用文字描述下核心吧,其实很简单。
1、部署. NET Core相关的运行环境,基本就是运行时和SDK
2、将发布的项目文件传到Linux系统
3、通过命令将项目启动并指定端口号
4、添加Supervisor进程守护监控
大体就是这样,emmm,看起来并不复杂,可惜我是个Linux系统小白,一些基本命令都得网上搜,怎么将本地的文件传到Linux系统都不了解,哎,还是一步一步的来吧

二、环境介绍

本文用到的操作系统和软件版本如下:
VS开发工具:Visual Studio 2019 Professional
SDK 版本:.NET Core 3.1
安装VMware虚拟机:VMware Workstation 15 Pro
虚拟机中安装Linux操作系统:CentOS 8.1 X64
远程连接Linux工具:Xshell 6

三、详细的部署过程,图文并茂

1、Linux-Centos8.1联网

因为部署过程中需要下载相应的环境,所以首先让我们的Centos8.1能够连上网络,怎么联网请参考博文:Linux-Centos8.1联网

2、本地和虚拟机能够互相PING通

因为我们需要将本地发布的文件放到Linux系统上,所以需要让本地和虚拟机能够相互访问,请参考博文:本地和虚拟机能够互相PING通

3、Centos8.1安装.NET Core环境

(1)首先呢,打开Centos8.1终端,然后切换成root权限,不然后边的很多操作没有权限。
Linux部署后端.NET Core 项目 - 图19
(2)安装 .NET Core之前,需要先注册 Microsoft 密钥;注册产品存储库;安装必需的依赖项。(每台计算机只需要执行一次此操作。)
#注册 Microsoft 密钥。注册产品存储库。安装必需的依赖项。
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
Linux部署后端.NET Core 项目 - 图20
(3)安装.NET Core Runtime
#安装 .NET Core 运行时
sudo yum -y install aspnetcore-runtime-3.1
Linux部署后端.NET Core 项目 - 图21
(4)安装.NET Core SDK
#安装.NET Core SDK
sudo yum -y install dotnet-sdk-3.1
Linux部署后端.NET Core 项目 - 图22
#查看Dotnet 版本信息
dotnet —version
#查看Dotnet 版本信息
dotnet —info
Linux部署后端.NET Core 项目 - 图23

4、发布.NET Core项目

Linux部署后端.NET Core 项目 - 图24

Linux部署后端.NET Core 项目 - 图25

注意这里使用的是框架依赖部署模式,因为之前我们已经安装了.NET Core环境,这里就不使用独立部署模式了。下面介绍下什么是依赖部署,什么是独立部署模式?

框架依赖部署

依赖框架的部署 (FDD) 是指依赖目标系统上 .NET Core环境。 由于已存在 .NET Core,因此应用在 .NET Core 安装程序间也是可移植的。简单的说,对于 FDD,仅部署应用程序和第三方依赖项, 不需要部署 .NET Core,因为应用将使用目标系统上存在的 .NET Core 版本。
优点:
①、不需要提前定义 .NET Core 应用将在其上运行的目标操作系统。 因为无论什么操作系统,.NET Core 的可执行文件和库都是用通用的 PE 文件格式,因此,无论什么基础操作系统,.NET Core 都可执行应用。
②、部署包很小。 只需部署应用及其依赖项,而无需部署 .NET Core 本身。
③、许多应用都可使用相同的 .NET Core 安装,从而降低了主机系统上磁盘空间和内存使用量。
缺点:
①、仅当主机系统上已安装你设为目标的 .NET Core 版本或更高版本时,应用才能运行。
②、如果不了解将来版本,.NET Core 运行时和库可能发生更改。 在极少数情况下,这可能会更改应用的行为。

独立部署

独立部署 (SCD) 是指不依赖目标系统上存在的共享组件。 所有组件(包括 .NET Core 库和 .NET Core 运行时)都包含在应用程序中,并且独立于其他 .NET Core 应用程序。
优点:
①、可以对与应用一起部署的 .NET Core 版本具有单独的控制权
②、目标系统可以运行你的 .NET Core 应用,因为你提供的是应用将在其上运行的 .NET Core 版本
缺点:
①、由于 .NET Core 包含在部署包中,因此必须提前选择为其生成部署包的目标平台
②、部署包相对较大,因为需要将 .NET Core 和应用及其第三方依赖项包括在内。
③、向系统部署大量独立的 .NET Core 应用可能会使用大量磁盘空间,因为每个应用都会复制 .NET Core 文件

5、将发布的项目上传到Linux系统

我是用的是XShell6工具上传的,主要就是使用XShell上传压缩包,然后在Linux系统上解压,具体操作可以参考博文:Linux上传文件的几种方式
我们先来看一下发布项目的文件夹列表:
Linux部署后端.NET Core 项目 - 图26

6、启动和停止.NET Core项目

首先进入目录/home/fontmiddleground/admin/publish,就是存放项目的目录
/home/fontmiddleground/admin/publish
Linux部署后端.NET Core 项目 - 图27
利用dotnet命令定义端口配置及环境
#启动站点,自定义端口号,运行环境
dotnet HyDataMiddleground.Admin.dll —urls=”http://*:8001“ —environment=Production
Linux部署后端.NET Core 项目 - 图28
访问启动的站点
#访问启动的站点
curl http://localhost:8001/
#停止站点 Ctrl+c
Linux部署后端.NET Core 项目 - 图29

7、为.NET Core项目创建Supervisor进程守护监控

(1)守护进程是什么?

在linux或者unix操作系统中,守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。由于在linux中,每个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,并且它脱离终端的目的是为了避免进程在运行的过程中的信息在任何终端中显示并且进程也不会被任何终端所产生的终端信息所打断。它从被执行的时候开始运转,直到整个系统关闭才退出。
此处的创建守护进程,是为发布在Linux上.net core 项目的宿主进程创建一个守护进程。在 Linux 上有很多可以管理进程的工具,我们使用 Supervisor 来做这个事情。
原因有两点:
①、它是微软官方文档推荐的,降低学习成本。
②、它并不一定是最好的,但一定是文档最全的。

(2)在Linux上安装Supervisor

Linux部署后端.NET Core 项目 - 图30
#执行epel-release
sudo yum -y install epel-release

安装Supervisor
sudo yum -y install supervisor

通过配置文件来启动supervisor
sudo supervisord -c /etc/supervisord.conf

启动supervisorctl
sudo supervisorctl -c /etc/supervisord.conf

查看supervisor 版本
version
Linux部署后端.NET Core 项目 - 图31
Linux部署后端.NET Core 项目 - 图32

(3)创建.NET Core项目的Supervisor配置文件

进入supervisord.d目录
cd /etc/supervisord.d
Linux部署后端.NET Core 项目 - 图33


新建NetCore进程配置文件
  sudo touch FontMiddlegroundNetCore.ini
查看和编辑FontMiddlegroundNetCore.ini配置文件
sudo vim FontMiddlegroundNetCore.ini
进入文件后,按“i”或者“a”进入插入模式,插入下面的配置信息
Linux部署后端.NET Core 项目 - 图34
#配置程序名称
[program:FontMiddlegroundNetCore]
#运行程序的命令
command=dotnet HyDataMiddleground.Admin.dll —urls=”http://*:8001;”
#命令执行的目录
directory=/home/fontmiddleground/admin/publish
#进程环境变量
environment=ASPNETCORE_ENVIRONMENT=Production
#进程执行的用户身份
user=root
#进程停止信号,可以为TERM, HUP, INT, QUIT, KILL, USR1, or USR2等信号默认为TERM >。当用设定的信号去干掉进程,退出码会被认为是expected,非必须设置
stopsignal=INT
#如果是true的话,子进程将在supervisord启动后被自动启动,默认就是true,非必须设置
autostart=true
#这个是设置子进程挂掉后自动重启的情况,有三个选项,false,unexpected和true。如果>为false的时候,无论什么情况下,都不会被重新启动,如果为unexpected,只有当进程的>退出码不在下面的exitcodes里面定义的退出码的时候,才会被自动重启。当为true的时候>,只要子进程挂掉,将会被无条件的重启
autorestart=true
#这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功了,默
认值为1 。非必须设置
startsecs=1
#错误日志文件
stderr_logfile=/home/fontmiddleground/admin/fontmiddleground.err.log
#输出日志文件
stdout_logfile=/home/fontmiddleground/admin/fontmiddleground.out.log
Linux部署后端.NET Core 项目 - 图35
按ESC,输入命令:wq保存配置文件

(4)重新加载Supervisor配置,查看Supervisor运行的进程

Linux部署后端.NET Core 项目 - 图36
#通过配置文件来启动supervisor
sudo supervisord -c /etc/supervisord.conf

启动supervisorctl
sudo supervisorctl -c /etc/**supervisord.conf**

重新加载配置文件
reload

查看运行的状态
status
Linux部署后端.NET Core 项目 - 图37
Linux部署后端.NET Core 项目 - 图38
下面我们来测试下站点是否运行正常
#查看相关进行
ps -aux | grep “HyDataMiddleground.Admin.dll”
#访问启动的站点
curl http://localhost:8001
注意:这里有个问题就是,当Linux系统关机后,Supervisor可能不会自己开启,导致需要手动执行sudo supervisord -c /etc/supervisord.conf 命令之后,Dotnet进程才会自动启动

(5)配置Supervisor开机自启动

进入system目录
cd /usr/lib/systemd/system

编辑supervisord.service文件
sudo vim supervisord.service
supervisord.service文件内容如下
Linux部署后端.NET Core 项目 - 图39
[Unit]
Description=Process Monitoring and Control Daemon
After=rc-local.service nss-user-lookup.target

[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf
ExecStop=/usr/bin/supervisorctl shutdown
ExecReload=/usr/bin/supervisorctl reload
KillMode=process
Restart=on-failure
RestartSec=42

[Install]
WantedBy=multi-user.target
Linux部署后端.NET Core 项目 - 图40
编辑好后保存退出,然后执行命令,查看是否启动成功
#启动服务
systemctl enable supervisord

验证一下是否为开机启动
systemctl is-enabled supervisord

Linux部署后端.NET Core 项目 - 图41

(6)验证进程守护监控效果

直接干掉Dotnet进程,看看会不会自动启动
Linux部署后端.NET Core 项目 - 图42
#查看dotnet进程
ps -aux|grep dotnet

强制杀死dotnet进程
kill -9 PID

再次查看dotnet进程
ps -aux|grep dotnet
Linux部署后端.NET Core 项目 - 图43

Linux部署后端.NET Core 项目 - 图44

重启Linux,然后直接访问站点

(7)Supervisor常用命令

Linux部署后端.NET Core 项目 - 图45
# 启动所有
supervisorctl start all

重启所有
supervisorctl restart all

停止所有
supervisorctl stop all

PS:要操作某个服务,把all换成服务名即可

查看服务状态
supervisorctl status
Linux部署后端.NET Core 项目 - 图46

8、防火墙配置,允许外网或局域网访问.NET Core站点

前面已经提到了,在配置urls的时候,不能使用http://localhost:8001类似这样的,否则即使把防火墙都关闭了,外网或者局域网都不能访问站点,当然了,不能因为外网或者局域网访问,我们就把防火墙关闭了,这样做对系统是很不安全的。防火墙的作用是防止不希望的、未授权的通信进出被保护的网络,迫使单位强化自己的网络安全政策。一般的防火墙都可以达到以下目的:
①、可以限制他人进入内部网络,过滤掉不安全服务和非法用户;
②、防止入侵者接近你的防御设施;
③、限定用户访问特殊站点。
④、为监视Internet安全提供方便。

先查看防火墙的状态,然后开放之前.NET Core项目所用到的8001端口,最后查看防火墙所开放的端口

Linux部署后端.NET Core 项目 - 图47
#查看防火墙状态
sudo firewall-cmd —state

开放8001端口
sudo firewall-cmd —zone=public —add-port=8001/tcp —permanent

重启防火墙
sudo firewall-cmd —reload

查看防火墙开放的端口
sudo firewall-cmd —list-ports
Linux部署后端.NET Core 项目 - 图48
注意:—permanent,这里是永久的意思,如果没有使用这个命令,重启Linux系统后,防火墙策略将会消失
Linux部署后端.NET Core 项目 - 图49

外网访问效果如图:
Linux部署后端.NET Core 项目 - 图50

防火墙常用命令

Linux部署后端.NET Core 项目 - 图51
#关闭防火墙
systemctl stop firewalld.service

开启防火墙
systemctl start firewalld.service

关闭开机自启动
systemctl disable firewalld.service

开启开机自启动
systemctl enable firewalld.service

查看某个端口是否开启
firewall-cmd —query-port=80/tcp

查看防火墙状态
firewall-cmd —state

查看防火墙开放的端口
firewall-cmd —list-ports

永久开放某个TCP端口
firewall-cmd —zone=public —add-port=80/tcp —permanent

永久关闭某个TCP端口
firewall-cmd —zone=public —remove-port=80/tcp —permanent

永久开放某个UDP端口
firewall-cmd —zone=public —add-port=80/udp —permanent

永久关闭某个UDP端口
firewall-cmd —zone=public —remove-port=80/udp —permanent

批量添加区间端口
firewall-cmd —zone=public —add-port=8081-8082/tcp —permanent
firewall-cmd —zone=public —add-port=8081-8082/udp —permanent
Linux部署后端.NET Core 项目 - 图52

三、总结

通过上述的过程,发现对Linux系统了解了好多,也掌握了好多知识,嗯,是的,基本可以说我已经入门了(#^.^#)。