首页 > 技术文章 > 【.Net Core】使用 Nginx 发布 .Net Core 3.1 项目至LInux(Centos7)

simawenbo 2020-12-07 18:00 原文

前置博客(博客中使用的项目来自于此):

【Docker】 .Net Core 3.1 webapi 集成EF Code First,使用MySql进行业务操作 、配置swagger (三)

 

环境:.Net Core 3.1 , Centos7.6

工具:连接工具MobaXterm,阿里云服务器一台

 

1.安装微软签名,不安装不能使用net。

rpm --import https://packages.microsoft.com/keys/microsoft.asc

 

2.安装.net环境,也可以单独安装 dotnet-runtime ,但是缺少很多方便的工具包,不推荐。

yum install dotnet-sdk-3.1

 

3.先修改要发布的端口号,再右键项目发布,然后修改信息,发布。

 

 

 发布完,到目标文件夹把文件拖到  /home/xxx(随意取名)   目录下

      

dotnet Test.dll 

使用donet XXX运行项目,Test.dll是项目名。 运行后此项目只能本机访问,没有任何作用

  PS.运行的时候当前目录一定要在项目文件夹 , 比如 在 /home/dotnet/Test 下执行 Test.dll ,如果在外部文件夹执行命令会有BUG。

 

下面使用nginx进行代理转发请求,使外网也能访问。

如果启动的端口是5000,Nginx 可把5000端口映射到其他端口。

 

4.添加 Nginx 存储库

在某些Centos版本要添加 CentOS 7 EPEL 仓库,实测Centos7.8不需要 :

yum install epel-release

 

5.安装 Nginx

yum install nginx

 

6.启动 Nginx

 systemctl enable nginx  #设置nginx为开机启动

 systemctl start nginx  #启动nginx服务

 // 其他

 systemctl stop nginx     #停止 nginx 服务

 systemctl restart nginx  #重启 nginx 服务

 systemctl nginx reload   #重新加载配置文件。

 systemctl status nginx   #查看服务器状态

 ps -ef | grep nginx      #查看Nginx是否启动

 

 

7.修改 Nginx 配置文件

两种方法,第一种是把 /etc/nginx/nginx.conf 文件中直接改 server 配置信息

第二种是把 /etc/nginx/nginx.conf 文件中server注释掉,然后在 /etc/nginx/conf.d/ 添加一个 xxx.conf 配置文件,如下所示

  红色画圈部分的意思是加载这个文件夹下面的所有 .conf 配置文件

 新建一个xxx.conf配置文件

 

 netcore.conf 配置如下

server {
    listen 80;
    location / {
        proxy_pass http://localhost:8001;
        
        proxy_http_version 1.1;

        proxy_set_header Upgrade $http_upgrade;

        proxy_set_header Connection keep-alive;

        proxy_set_header Host $http_host;
 
        proxy_cache_bypass $http_upgrade;
    }
}

保存后重启nginx

 systemctl restart nginx  #重启 nginx 服务

或者刷新配置

sudo nginx -t    #检查配置文件
sudo nginx -s reload    #重新加载配置文件

访问站点80端口(80端口是默认端口自动隐藏),此端口会被nginx转发至 8001端口

 再看看项目配置的swagger文档

 

 

 

8.配置守护进程Supervisor

项目启动只能前台运行,不能进行其他操作,所以要建一个守护进程,使得项目后台运行

安装 supervisor

yum install supervisor

 检查 /etc/supervisord.conf 配置文件,如果不为圈中代码,请修改为圈中代码。

意思是 supervisord.d 文件夹下的所有 ini 类型的文件都是配置文件

 

 

 

到/etc/supervisord.d 目录下 新建 xxx.ini文件,文件配置内容如下 自己定义,记得一定要改运行命令和程序路径。

[program:TestNetCore]
command=dotnet Test.dll                        #运行命令
directory=/home/dotnet/Test                    #程序路径
environment=ASPNETCORE__ENVIRONMENT=Production #环境变量
user=root        #设置启动进程的用户,默认是root
stopsignal=INT   #请求停止时用来杀死程序的信号
autostart=true   #自动启动
autorestart=true #3秒自动重启
startsecs=3      #自动重启间隔
stderr_logfile=/var/log/ossoffical.err.log  #标准错误日志 路径可以自定义
stdout_logfile=/var/log/ossoffical.out.log  #标准输出日志  路径可以自定义

保存配置文件,启动守护进程,然后设置开机启动

supervisord -c /etc/supervisord.conf  #启动服务
supervisorctl reload #重新加载配置
systemctl enable supervisord #开机启动
systemctl disable supervisord #取消开机启动

其他相关操作

supervisorctl shutdown #关闭
supervisorctl reload      #重启
systemctl is-enabled supervisord #验证是否开机启动
systemctl status supervisord.service #执行命令,查看服务器启动失败的原因
supervisorctl status                     #查看服务状态
supervisorctl stop TestNetCore     #停止某个服务
supervisorctl start TestNetCore    #开始某个服务
supervisorctl restart TestNetCore # 重启某个服务

测试一下是不是进程停止后supervisor使之自动启动。

 

 

----- 分割线  -----   2020/12/23号补充 -------

最近在公司管服务器,新学会一种运行方式,特此分享,就是在dotnet xx.dll之前+nohup   后+ &

nohup dotnet Test.dll --urls="http://*:8001" > /dev/null 2>&1 &

 > /dev/null 2>&1   : 将日志输出至 /dev/null , 2>&1 把错误输出日志和标准输出日志合并输出

  • 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
  • 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
  • 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。

 

写一个简单Shell脚本,每次发布项目,重启项目都使用这个脚本

脚本名定为: restartApi.sh

kill -9 $(ps -ef | grep 'dotnet Test.dll --urls=http://\*:8001' | grep -v grep | awk '{print $2}')

cd ./Test && nohup dotnet Test.dll --urls="http://*:8001" &

echo "重启Test.Api执行完成"

说明:

1:搜索到名为 XXX 的进程,过滤掉grep本身进程,再选取输出结果中的第二条数据(即PID),根据PID杀死这个进程。

2:   进入Test目录下(项目在./home/dotnet/Test ,restartApi.sh在./home/dotnet), 运行项目。

3:输出提示

使用 chmod u+x  赋予文件执行权限, 也可以使用 chmod 777 给所有权限。

 chmod 777 restartApi.sh 

执行脚本

./restartApi.sh 

 

 

 

 如果出现Killed提示,Ctrl+C退出就可以

 

推荐阅读