Loading... # 一、概要 整个流程如下: 1、部署. NET Core相关的运行环境,基本就是运行时或者SDK 2、将发布的项目文件传到Linux系统 3、通过命令将项目启动并指定端口号 4、添加Supervisor进程守护监控 # 二、环境介绍 本文用到的操作系统和软件版本如下: Linux:centos8.3 VS开发工具:Visual Studio 2019 Professional SDK 版本:.NET Core 5.0 # 三、部署过程 ## 1、安装.NET Core环境 客户端通过Xshell打开Centos8.3终端,然后切换成root权限,不然后边的很多操作没有权限。 ![](https://hunji.xyz/usr/uploads/2021/12/2560647821.png) 安装.NET SDK,.NET SDK 使你可以通过 .NET 开发应用。 如果安装 .NET SDK,则无需安装相应的运行时。 ``` sudo dnf install dotnet-sdk-5.0 ``` ![](https://hunji.xyz/usr/uploads/2021/12/1228570484.png) ``` #查看Dotnet 版本信息 dotnet --version ``` ``` #查看Dotnet 版本信息 dotnet --info ``` ![](https://hunji.xyz/usr/uploads/2021/12/2450465597.png) ## 2、发布.NET Core项目 ![](https://hunji.xyz/usr/uploads/2021/12/1595162431.png) 注意这里使用的是框架依赖部署模式,因为之前我们已经安装了.NET Core环境,这里就不使用独立部署模式了。下面介绍下什么是依赖部署,什么是独立部署模式? ### 框架依赖部署 依赖框架的部署 (FDD) 是指依赖目标系统上 .NET Core环境。 由于已存在 .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 文件 ## 3、将发布的项目上传到Linux系统 我是用的是XShell6工具上传的,主要就是使用XShell上传压缩包,然后在Linux系统上解压,具体操作可以参考博文:[Linux远程连接及上传文件](https://www.cnblogs.com/qtiger/p/13846070.html)和[Linux-Centos下安装工具用来解压压缩](https://www.cnblogs.com/qtiger/p/13847245.html) 。我们先来看一下发布项目的文件夹列表: ![](https://hunji.xyz/usr/uploads/2021/12/1860768878.png) 可以看到安装包是rar的,CentOS本身不自带rar环境,因此对于rar文件无法直接解压,需要先配置rar环境,可以参考解压:[Linux-Centos下安装工具用来解压压缩](https://www.cnblogs.com/qtiger/p/13847245.html) ![](https://hunji.xyz/usr/uploads/2021/12/1277956353.png) ## 4、启动和停止.NET Core项目 首先进入目录/publish,就是存放项目的目录 ![](https://hunji.xyz/usr/uploads/2021/12/2212462682.png) 利用dotnet命令启动项目 ``` #启动站点,自定义端口号,运行环境 dotnet HyWebSocketServer.dll ``` ![](https://hunji.xyz/usr/uploads/2021/12/2550805328.png) 访问启动的站点 ``` #访问启动的站点 http://ip:9000#停止站点 Ctrl+c ``` 浏览器打开如下: ![](https://hunji.xyz/usr/uploads/2021/12/4080369302.png) # 四、Supervisor守护进程 ## 1、守护进程是什么? 在linux或者unix操作系统中,守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。由于在linux中,每个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,并且它脱离终端的目的是为了避免进程在运行的过程中的信息在任何终端中显示并且进程也不会被任何终端所产生的终端信息所打断。它从被执行的时候开始运转,直到整个系统关闭才退出。在 Linux 上有很多可以管理进程的工具,我们使用 Supervisor 来做这个事情。 原因有两点: ①、它是微软官方文档推荐的,降低学习成本。 ②、它并不一定是最好的,但一定是文档最全的。 ## 2、Supervisor概述 Supervisor是一个客户端/服务器系统,用 Python 开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台 daemon,并监控进程状态,异常退出时能自动重启。supervisor 还能很友好的管理程序在命令行上输出的日志,可以将日志重定向到自定义的日志文件中,还能按文件大小对日志进行分割。supervisor主要包含以下四个部分: - supervisord:supervisord是supervisor的服务端,负责管理我们配置的子进程,包括重启崩溃或异常退出的子进程,同时也响应来自客户端的请求。 - supervisorctl:supervisord的客户端命令行。我们可以通过supervisorctl获得由主进程控制的子进程的状态,停止和启动子进程,并获得主进程的运行列表。 - Web Server:和supervisorctl功能差不多,是通过web界面查看和控制进程状态。 - XML-RPC Interface:服务于web UI的同一个HTTP服务器提供一个XML-RPC接口,可以用来询问和控制管理程序及其运行的程序。 ## 3、安装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 ``` ![](https://hunji.xyz/usr/uploads/2021/12/621697372.png) ## 4、创建Supervisor配置文件 进入supervisord.d目录 ``` cd /etc/supervisord.d ``` 新建NetCore进程配置文件 sudo touch WsServerNetCore.ini ![](https://hunji.xyz/usr/uploads/2021/12/1906784731.png) 查看和编辑WsServerNetCore.ini配置文件 ``` sudo vim WsServerNetCore.ini ``` 进入文件后,按“i”或者“a”进入插入模式,插入下面的配置信息 #配置程序名称 [program:HyWebSocketServer] #运行程序的命令 command=dotnet HyWebSocketServer.dll #命令执行的目录 directory=~/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=~/HyWebSocketServer/hyWebSocketServer.err.log #输出日志文件 stdout\_logfile=~/HyWebSocketServer/hyWebSocketServer.out.log 按ESC,输入命令:wq保存配置文件 ## 5、启动supervisor ``` #启动方式1:通过supervisor服务端使用配置文件启动 sudo supervisord -c /etc/supervisord.conf ``` ``` #启动方式2:通过客户端命令行启动 #先启动supervisorctl sudo supervisorctl -c /etc/supervisord.conf #重新加载配置文件 reload #查看运行的状态 status ``` ####################出现了以下错误: #### 错误一: ``` Error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting supervisord. ``` 解决方法: ``` ps aux | grep supervisord kill - 9 进程ID ``` #### 错误二: ``` Unlinking stale socket /var/run/supervisor/supervisor.sock ``` 解决方法: ``` unlink /var/run/supervisor/supervisor.sock ``` #### ######################## ![](https://hunji.xyz/usr/uploads/2021/12/1191080126.png) 测试下站点是否运行正常 ``` #查看相关进行 ps -aux | grep "HyWebSocketServer.dll" #访问启动的站点 https://ip:9000 ``` ![](https://hunji.xyz/usr/uploads/2021/12/3088079083.png) 注意:这里有个问题就是,当Linux系统关机后,Supervisor可能不会自己开启,导致需要手动执行sudo supervisord -c /etc/supervisord.conf 命令之后,Dotnet进程才会自动启动 ## 6、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 ``` ![](https://hunji.xyz/usr/uploads/2021/12/3815118449.png) ## 7、守护进程的效果 直接干掉Dotnet进程,看看会不会自动启动 ``` #查看dotnet进程 ps -aux|grep dotnet #强制杀死dotnet进程 kill -9 PID #再次查看dotnet进程 ps -aux|grep dotnet ``` ![](https://hunji.xyz/usr/uploads/2021/12/994880785.png) 重启Linux,然后直接访问站点 ## 8、supervisorctl 常用命令 supervisorctl 是 supervisord的命令行客户端工具 ``` # 启动所有进程 supervisorctl start all # 重启所有进程 supervisorctl restart all # 停止所有进程 supervisorctl stop all #PS:要操作某个服务,把all换成服务名即可 #重新启动配置中的所有程序supervisorctl reload ``` ``` #查看服务状态 supervisorctl status ``` ## 9、防火墙配置 在配置urls的时候,不能使用http://localhost:9000类似这样的,否则即使把防火墙都关闭了,外网或者局域网都不能访问站点,当然了,不能因为外网或者局域网访问,我们就把防火墙关闭了,这样做对系统是很不安全的。防火墙的作用是防止不希望的、未授权的通信进出被保护的网络,迫使单位强化自己的网络安全政策。一般的防火墙都可以达到以下目的: ①、可以限制他人进入内部网络,过滤掉不安全服务和非法用户; ②、防止入侵者接近你的防御设施; ③、限定用户访问特殊站点。 ④、为监视Internet安全提供方便。 先查看防火墙的状态,然后开放之前.NET Core项目所用到的9000端口,最后查看防火墙所开放的端口 ``` #查看防火墙状态 sudo firewall-cmd --state #开放9000端口 sudo firewall-cmd --zone=public --add-port=9000/tcp --permanent #重启防火墙 sudo firewall-cmd --reload #查看防火墙开放的端口 sudo firewall-cmd --list-ports ``` 注意:--permanent,这里是永久的意思,如果没有使用这个命令,重启Linux系统后,防火墙策略将会消失 ## 10、防火墙常用命令 ``` #关闭防火墙 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 ``` 最后修改:2021 年 12 月 30 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 16 如果觉得我的文章对你有用,请随意赞赏
2 条评论
这篇文章很介绍的很全啊,收藏了~
欢迎大佬回访