.net core项目在 linux服务器部署的解决方法,按照操作流程来一定能成功部署,很简单
请准备以下环境和工具进行项目的部署
1、系统环境:CentOS8
2、.net core :3.1
3、Mysql:8.0
4、准备工具:
1) VMware Workstation 15 Pro下载地址:
https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html
2)Xshell-6.0.0189p下载地址:
链接:https://pan.baidu.com/s/166tU06y8BBS-AugDyXFuvA
提取码:vvqy
3)CentOS8下载地址:
http://mirrors.aliyun.com/centos/8/isos/x86_64/
4)Mobaxterm用于文件上传到linux系统中,mobaxterm工具去百度搜索下这里就不提供了
5、以下部署的项目假设为:LokiCore.dll
第一、在CentOS8中安装.net core环境
1.安装.NET Core Runtime,安装过程中可能需要输入Linux密码以及提示选择Y/N,选择Y,,如果遇网络问题,可以重新执行命令试试
#注册 Microsoft 密钥。注册产品存储库。安装必需的依赖项。
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
#安装 .NET Core 运行时
sudo yum -y install aspnetcore-runtime-3.1
#查看Dotnet 版本信息
dotnet --info
2.安装.NET Core SDK
#安装.NET Core SDK
sudo yum -y install dotnet-sdk-3.1
#查看Dotnet 版本信息
dotnet --info
#查看Dotnet 版本信息
dotnet --version
第二、发布.NET Core项目到Linux
1、.net core LokiCore应用发布有两种方式,框架依赖部署和独立部署,对.net core版本独立性要求不是很高的,通常用框架依赖部署 进行发布应用程序,发布时,目标运行时:选择Linux,因为这里是发布到linux上;
2、.net core应用发布成功后,通过XShell或者mobaxterm工具上传到linux服务器中,在/var/文件夹中建立一个www的文件夹,然后将.net core LokiCore应用程序上传进去,以下是mobaxterm上传工具将文件上传到linux中
第三、启动和停止.NET Core项目
注意:
①、这里urls配置,如果需要局域网或者外网访问,不能填成urls="http://localhost:8081;http://localhost:8082"
②、关闭Xshell的会话之后,站点同时需要能访问
③、执行启动命令,一定要指定LokiCore.dll的路径或者进入站点目录,否则会启动不成功
1、操作步骤
#进入www目录
cd /var/www
#启动站点,自定义端口号,运行环境
nohup dotnet LokiCore.dll.dll --urls="http://*:8081;http://*:8082" --environment=Development > /dev/null 2>&1 &
#查看相关进行
ps -aux | grep "LokiCore.dll"
#访问启动的站点
curl http://localhost:8081/
启动站点说明:
/dev/null相当于执行了command 1 > /dev/null。执行command产生了标准输出stdout(用1表示),重定向到/dev/null的设备文件中
/dev/null可以理解为/dev路径下的空文件;该命令将command命令的标准输出输出到空文件中
2>&1:可以理解为执行command产生的标准输出重定向到文件中,标准错误也重定向到文件中,期间只打开一次文件,&1的含义就可以理解为用标准输出的引用,引用的就是重定向标准输出产生打开的文件
第四、为.NET Core项目创建Supervisor进程守护监控
1、Supervisor介绍
此处的创建守护进程,是指发布在Linux上 asp.net core 程序的dotnet LokiCore.dll命令的宿主进程创建一个守护进程。在 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
注意:需要执行supervisorctl,如果出现error:
3、创建.NET Core项目的Supervisor配置文件
#进入supervisord.d目录
cd /etc/supervisord.d
#新建NetCore进程配置文件
sudo touch LokiCore.ini
#查看和编辑LokiCore.dll.ini配置文件
sudo vim LokiCore.ini
#进入文件后,按“i”或者“a”进入插入模式,插入下面的配置信息,配置程序名称不能有特殊符号比如:.号,如果:EMS.Server.Api这肯定会错,一定要编写成:emsserverapi
#配置程序名称 [program:LokiCore] #运行程序的命令 command=dotnet LokiCore.dll --urls="http://*:8081;http://*:8082"#命令执行的目录 directory=/var/www #进程环境变量 environment=ASPNETCORE_ENVIRONMENT=Production #进程执行的用户身份 user=demo #进程停止信号,可以为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=/var/log/DemoNetCore.err.log #输出日志文件 stdout_logfile=/var/log/DemoNetCore.out.log
touch alonsoadminapi.ini 建立文件
vim alonsoadminapi.ini 编辑文件
文件内容复制到alonsoadminapi.ini:
[program:alonsoadminapi] command=dotnet AlonsoAdmin.HttpApi.dll --urls="http://*:8889"directory=/var/AlonsoAdmin.Api/environment=ASPNETCORE_ENVIRONMENT=Development user=root stopsignal=INT autostart=trueautorestart=truestartsecs=1stderr_logfile=/var/log/AlonsoAdmin.HttpApi.err.log stdout_logfile=/var/log/AlonsoAdmin.HttpApi.out.log
############################################################
上述配置配置好后,请按下面操作执行:
#按ESC,输入命令保存配置文件
:wq (保存编辑操作退出)
:wq! (保存编辑强制退出)
:w ! sudo tee %
注意:如果之前进入编辑文件没有在root或者sudo下,使用wq,将会提示只读,使用强制执行,使用wq!,将会提示E212:无法打开或写入文件,这个时候需要用到w ! sudo tee %这个命令,然后在q退出编辑
添加了新配置文件后,一定要按以下顺序来执行指令,新的子进程才会在supervisor的管理界面中呈现出来
之前习惯用reload 命令,这直接重启supervisord进程,相当于重启了所有supervisor程序。
supervisorctl reload
如果新添加了一个配置文件,此时update命令没用了,要用reread命令,重新读取配置文件。然后再update重启
supervisorctl reread
但是有时候只改动了某个配置文件,只想重载这个配置文件然后重启,不影响其他配置文件。可以用update命令
supervisorctl update
supervisor配置文件详解
- command:启动程序使用的命令,可以是绝对路径或者相对路径- process_name:一个python字符串表达式,用来表示supervisor进程启动的这个的名称,默认值是%(program_name)s- numprocs:Supervisor启动这个程序的多个实例,如果numprocs>1,则process_name的表达式必须包含%(process_num)s,默认是1- numprocs_start:一个int偏移值,当启动实例的时候用来计算numprocs的值- priority:权重,可以控制程序启动和关闭时的顺序,权重越低:越早启动,越晚关闭。默认值是999- autostart:如果设置为true,当supervisord启动的时候,进程会自动重启。- autorestart:值可以是false、true、unexpected。false:进程不会自动重启,unexpected:当程序退出时的退出码不是exitcodes中定义的时,进程会重启,true:进程会无条件重启当退出的时候。- startsecs:程序启动后等待多长时间后才认为程序启动成功- startretries:supervisord尝试启动一个程序时尝试的次数。默认是3- exitcodes:一个预期的退出返回码,默认是0,2。- stopsignal:当收到stop请求的时候,发送信号给程序,默认是TERM信号,也可以是 HUP, INT, QUIT, KILL, USR1, or USR2。- stopwaitsecs:在操作系统给supervisord发送SIGCHILD信号时等待的时间- stopasgroup:如果设置为true,则会使supervisor发送停止信号到整个进程组- killasgroup:如果设置为true,则在给程序发送SIGKILL信号的时候,会发送到整个进程组,它的子进程也会受到影响。- user:如果supervisord以root运行,则会使用这个设置用户启动子程序- redirect_stderr:如果设置为true,进程则会把标准错误输出到supervisord后台的标准输出文件描述符。- stdout_logfile:把进程的标准输出写入文件中,如果stdout_logfile没有设置或者设置为AUTO,则supervisor会自动选择一个文件位置。- stdout_logfile_maxbytes:标准输出log文件达到多少后自动进行轮转,单位是KB、MB、GB。如果设置为0则表示不限制日志文件大小- stdout_logfile_backups:标准输出日志轮转备份的数量,默认是10,如果设置为0,则不备份- stdout_capture_maxbytes:当进程处于stderr capture mode模式的时候,写入FIFO队列的最大bytes值,单位可以是KB、MB、GB- stdout_events_enabled:如果设置为true,当进程在写它的stderr到文件描述符的时候,PROCESS_LOG_STDERR事件会被触发- stderr_logfile:把进程的错误日志输出一个文件中,除非redirect_stderr参数被设置为true- stderr_logfile_maxbytes:错误log文件达到多少后自动进行轮转,单位是KB、MB、GB。如果设置为0则表示不限制日志文件大小- stderr_logfile_backups:错误日志轮转备份的数量,默认是10,如果设置为0,则不备份- stderr_capture_maxbytes:当进程处于stderr capture mode模式的时候,写入FIFO队列的最大bytes值,单位可以是KB、MB、GB- stderr_events_enabled:如果设置为true,当进程在写它的stderr到文件描述符的时候,PROCESS_LOG_STDERR事件会被触发- environment:一个k/v对的list列表- directory:supervisord在生成子进程的时候会切换到该目录- umask:设置进程的umask- serverurl:是否允许子进程和内部的HTTP服务通讯,如果设置为AUTO,supervisor会自动的构造一个url
重新加载Supervisor配置,查看Supervisor运行的进程
#通过配置文件来启动supervisor
sudo supervisord -c /etc/supervisord.conf
#启动supervisorctl
sudo supervisorctl -c /etc/supervisord.conf
#重新加载配置文件
Supervisor># reload
#查看运行的状态
Supervisor># status
4、配置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
重启Linux,然后直接访问站点
6.Supervisor常用命令
# 启动所有
supervisorctl start all
# 重启所有
supervisorctl restart all
# 停止所有
supervisorctl stop all
#PS:要操作某个服务,把all换成服务名即可
#查看服务状态
supervisorctl status
第五、防火墙配置,允许外网或局域网访问.NET Core站点
1.先查看防火墙的状态,然后开放之前.NET Core项目所用到的8081、8082端口,最后查看防火墙所开放的端口
#查看防火墙状态
sudo firewall-cmd --state
#开放8081端口
sudo firewall-cmd --zone=public --add-port=8081/tcp --permanent
#开放8082端口
sudo firewall-cmd --zone=public --add-port=8082/tcp --permanent
#重启防火墙
sudo firewall-cmd --reload
#查看防火墙开放的端口
sudo firewall-cmd --list-ports
部署成功的项目如图
要能打开supervisor的管理界面需对/etc/supervisord.conf进行修改请查看链接
https://www.cnblogs.com/axinno1/p/14617780.html 最后一个配置来做修改,就能配置好
注意:--permanent,这里是永久的意思,如果没有使用这个命令,重启Linux系统后,防火墙策略将会消失
重启Linux系统之后,在尝试用Postman访问站点,发现正常
2.防火墙常用命令
#关闭防火墙
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
本人按照流程来项目部署,结果成功