.net core项目在 linux服务器部署的解决方法

 

下面内容有添加端口的地方请检查是否有添加,

lsof -iTCP -sTCP:LISTEN -P | grep :8989

如果有就要不就改变端口,要不就杀掉占用端口的进程

kill -9 PID

 

请准备以下环境和工具进行项目的部署

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

#启动站点,自定义端口号,运行环境,注意:这里的端口要先开通,firewall-cmd --zone=public --add-port=8988/tcp --permanent
nohup dotnet LokiCore.dll --urls="http://*:8988" --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: <class 'socket.error'>, [Errno 13] Permission denied: file: /usr/lib64/python2.7/socket.py line: 224的错误,需要先执行下面语句:
sudo supervisord -c /etc/supervisord.conf
sudo supervisorctl -c /etc/supervisord.conf

接下来开通supervisor的默认端口9001

 firewall-cmd --zone=public --add-port=9001/tcp --permanent
firewall-cmd --reload

开通supervisord.conf配置文件路劲中配置路劲的权限

touch /var/run/supervisor/supervisor.sock
chmod 777 /var/run/supervisor/supervisor.sock
chmod 777 /var/log/supervisor/supervisord.log
chmod 777 /var/run
chmod 777 /var/log
supervisorctl update
supervisorctl reload

 

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=true
autorestart=true
startsecs=1
stderr_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

本人按照流程来项目部署,结果成功

posted on 2020-12-16 16:11  aXinNo1  阅读(1845)  评论(0编辑  收藏  举报