【.Net Core】使用 Nginx 发布 .Net Core 3.1 项目至LInux(Centos7)
前置博客(博客中使用的项目来自于此):
【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 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退出就可以