[转载]虚拟机上Linux部署.NET Core项目

一、在虚拟机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权限,不然后边的很多操作没有权限。

(2)安装 .NET Core之前,需要先注册 Microsoft 密钥;注册产品存储库;安装必需的依赖项。(每台计算机只需要执行一次此操作。)

#注册 Microsoft 密钥。注册产品存储库。安装必需的依赖项。
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm

 (3)安装.NET Core Runtime

#安装 .NET Core 运行时
sudo yum -y install aspnetcore-runtime-3.1

 (4)安装.NET Core SDK  

#安装.NET Core SDK
sudo yum -y install dotnet-sdk-3.1

 

#查看Dotnet 版本信息
dotnet --version
#查看Dotnet 版本信息
dotnet --info

4、发布.NET Core项目

  

  

注意这里使用的是框架依赖部署模式,因为之前我们已经安装了.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上传文件的几种方式

我们先来看一下发布项目的文件夹列表:

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

首先进入目录/home/fontmiddleground/admin/publish,就是存放项目的目录 

/home/fontmiddleground/admin/publish

 利用dotnet命令定义端口配置及环境

#启动站点,自定义端口号,运行环境
dotnet HyDataMiddleground.Admin.dll --urls="http://*:8001" --environment=Production

 访问启动的站点

#访问启动的站点
curl http://localhost:8001/
#停止站点 Ctrl+c

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

(1)守护进程是什么?

在linux或者unix操作系统中,守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。由于在linux中,每个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,并且它脱离终端的目的是为了避免进程在运行的过程中的信息在任何终端中显示并且进程也不会被任何终端所产生的终端信息所打断。它从被执行的时候开始运转,直到整个系统关闭才退出。

此处的创建守护进程,是为发布在Linux上.net core 项目的宿主进程创建一个守护进程。在 Linux 上有很多可以管理进程的工具,我们使用 Supervisor 来做这个事情。

原因有两点:
①、它是微软官方文档推荐的,降低学习成本。
②、它并不一定是最好的,但一定是文档最全的。 

(2)在Linux上安装Supervisor

复制代码
#执行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
复制代码

  

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

进入supervisord.d目录

cd /etc/supervisord.d

 

 

新建NetCore进程配置文件

  sudo touch FontMiddlegroundNetCore.ini

查看和编辑FontMiddlegroundNetCore.ini配置文件 

sudo vim FontMiddlegroundNetCore.ini

进入文件后,按“i”或者“a”进入插入模式,插入下面的配置信息

复制代码

#配置程序名称
[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

复制代码

按ESC,输入命令:wq保存配置文件

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

复制代码
#通过配置文件来启动supervisor
sudo supervisord -c /etc/supervisord.conf

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

#重新加载配置文件
reload

#查看运行的状态
status
复制代码

下面我们来测试下站点是否运行正常 

#查看相关进行
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文件内容如下 

复制代码
[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
复制代码

编辑好后保存退出,然后执行命令,查看是否启动成功 

#启动服务
systemctl enable supervisord

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

 

  

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

直接干掉Dotnet进程,看看会不会自动启动 

复制代码
#查看dotnet进程
ps -aux|grep dotnet

#强制杀死dotnet进程
kill -9 PID

#再次查看dotnet进程
ps -aux|grep dotnet
复制代码

 

 

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

(7)Supervisor常用命令 

复制代码
# 启动所有
supervisorctl start all

# 重启所有
supervisorctl restart all

# 停止所有
supervisorctl stop all

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

#查看服务状态
supervisorctl status
复制代码

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

前面已经提到了,在配置urls的时候,不能使用http://localhost:8001类似这样的,否则即使把防火墙都关闭了,外网或者局域网都不能访问站点,当然了,不能因为外网或者局域网访问,我们就把防火墙关闭了,这样做对系统是很不安全的。防火墙的作用是防止不希望的、未授权的通信进出被保护的网络,迫使单位强化自己的网络安全政策。一般的防火墙都可以达到以下目的:

①、可以限制他人进入内部网络,过滤掉不安全服务和非法用户;
②、防止入侵者接近你的防御设施;
③、限定用户访问特殊站点。
④、为监视Internet安全提供方便。 

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

复制代码
#查看防火墙状态
sudo firewall-cmd --state

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

#重启防火墙
sudo firewall-cmd --reload

#查看防火墙开放的端口
sudo firewall-cmd --list-ports 
复制代码

注意:--permanent,这里是永久的意思,如果没有使用这个命令,重启Linux系统后,防火墙策略将会消失

 

 

外网访问效果如图:

 

 

防火墙常用命令 

复制代码
#关闭防火墙
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
复制代码

 

posted @ 2021-01-13 11:46  qishidz  阅读(420)  评论(0编辑  收藏  举报