.NetCore程序的linux部署说明
主要内容
本篇介绍在linux部署.netcore程序的几种方式,包括传统方式,服务打包,docker部署等。
系统环境/工具
- 腾讯云服务器
- 操作系统:centos8.2
- 地址:124.221.86.194
- 用户名:root
- 密码:hyt-linux12345!
- 远程连接工具:xShell6
- 数据库使用mariadb
- 用户名:root
- 密码:mysql123!
- 端口:3306
- 应用程序版本.net6.0(后端) + vue3.0(前端)
部署方式一:传统部署
0、linux的包管理器
- Centos的包管理器
- rpm
- yum
- dnf
- Ubuntu的包管理器
- apt-get
- apt
- snap
本地打包,服务器直接部署
1、安装mariadb
安装和配置
#1.安装命令
sudo yum install mariadb-server #2.查看状态
sudo systemctl status mariadb#3.服务启动
sudo systemctl start mariadb#4.开机自启
sudo systemctl enable mariadb #5.安装完成首次使用前初始化数据库,设置root新密码(mysql123!)
mysql_secure_installation#6.数据库登陆测试
sudo mysql -u root -p#7.设置数据库远程登陆账号
use mysql;
select user,hose from user;#步骤1:查看root账号有没有host为%的记录,如果没有需要增加,查看步骤2
update user set host = '%' where host = 'localhost';#步骤2:修改localhost为%,如果不修改数据库无法远程登陆,如果执行失败直接执行步骤3
grant all privileges on *.* to 'root'@'%' identified by 'mysql123!';#步骤3:授权给root用户;*.*表示所有数据库下的所有表;'root'@'%' 表示支持所有ip地址使用root访问。
flush privileges; #步骤4:刷新数据库,也可以重启数据库服务 systemctl restart mariadb#8.服务器防火墙开启数据库端口(一般不选择关闭防火墙的操作,采用防火墙开放指定端口的策略)
firewall-cmd --query-port=3306/tcp #查看防火墙是否开放数据库端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent #如果没有开放需要开放#9.如果是云服务器,检查云服务器本身的防火墙策略是否打开指定端口#10.本地备份mariadb数据库(使用powershell导出后放到linux有问题,需要使用cmd导出)
d:\Program Files\MariaDB 10.8\bin>mysqldump.exe --opt --single-transaction=TRUE --user=root --password=123456 --default-character-set=utf8 ceredb >D:\Work\CERE\DB\cere_backup.sql#11.将备份的数据库文件还原到服务器(将数据库备份文件上传到服务器)
CREATE DATABASE ceredb; #创建一个空数据库
use ceredb; #切换到创建的数据
source /home/DB/cere_backup.sql; #执行还原#12.检查数据库配置是否区分大小写,windows没有这个问题,只有linux有
cd /etc/my.cnf
#在[mysqld]下添加配置: lower_case_table_names = 1
#如果配置文件指向!includedir /etc/my.cnf.d,则修改对应的文件
cd /etc/my.cnf.d/mariadb-server.cnf#重启服务
sudo systemctl restart mariadb #关闭服务
sudo systemctl stop mariadb #数据库密码修改
set password for 'root'@'%' = password('123456');#linux服务器上备份数据 mysqldump -h 地址 -P 端口 --hex-blob -R -u 用户 -p 数据库名 > 备份.sql
cd /home/DB #打开想要存放的目录
mysqldump -h 127.0.0.1 -P 3306 --hex-blob -R -u root -p ceredb > 备份.sql #执行命令,输入密码后生成备份文件
-
数据库服务启动查看状态
-
更新数据库user表,实现数据库远程连接
-
查看云服务器本身防火墙策略
-
my.cnf 配置
-
mariadb-server.cnf配置
-
windows系统使用DataGrip备份和还原mysql
-
备份数据库
-
使用备份文件还原
-
问题
- Q1:登陆失败 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
- 解决:确认登陆用户名密码是否正确
- Q2:远程连接数据库失败
- 关闭服务器防火墙或者防火墙开放数据库端口。
- 如果是云服务器检查是否防火墙有相关配置
- 查看mysql远程登陆是否开启
防火墙配置
#查看防火墙状态
systemctl status firewalld.service#禁用防火墙的服务
systemctl disable firewalld.service#关闭防火墙
systemctl stop firewalld.service#打开防火墙
systemctl start firewalld.service#开机启动防火墙
systemctl enable firewalld.service#查看防火墙是否开放某个端口(例如3306)
firewall-cmd --query-port=3306/tcp#防火墙开放指定端口(例如3306)
firewall-cmd --zone=public --add-port=3306/tcp --permanent#防火墙关闭指定端口(例如3306)
firewall-cmd --zone=public --remove-port=3306/tcp --permanent #配置立即生效
firewall-cmd --reload
2、安装nodejs
#因为要安装进程守护pm2所以要先安装node
#安装命令
1.sudo yum install nodejs npm#查看node版本
2.nodejs --version#查看npm版本
3.npm -v#安装cnpm,提高安装包的速度
4.npm install -g cnpm --registry=https://registry.npm.taobao.org
3、安装pm2
#需要先安装node
#安装命令
1.cnpm install -g pm2#查看监控的进程
2.pm2 list#添加进程监控
3.pm2 start " 程序启动脚本 " --name 进程名#查看日志
pm2 logs 进程名#查看进程
pm2 info 进程名#监控进程
pm2 monit 进程名#重启进程
pm2 restart 进程名#删除进程
pm2 delete 进程名#开机自启
pm2 startup
pm2 save
4、安装nginx
#1.安装nginx
sudo yum install nginx#2.开机自启
sudo systemctl enable nginx#3.启动nginx
sudo systemctl start nginx#4.查看状态
sudo systemctl status nginx#重启服务
systemctl restart nginx#修改配置检查语法
nginx -t#立刻重启
nginx -s reload#查看日志
cd vi /var/log/nginx/error.log
5.安装.NET-SDK
#官方文档centos8是不支持.net6.0的
#1.将 Microsoft 包签名密钥添加到受信任密钥列表,并添加 Microsoft 包存储库,这一步保证能够下载最新的版本。
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm#2.安装SDK(为了方便直接安装SDK)
sudo yum install dotnet-sdk-6.0#3.查看版本
dotnet --info#安装.net6 SDK (sdk包含运行时和编译环境,安装sdk除了可以运行程序外还可以对源代码进行编译打包)
sudo yum install dotnet-sdk-6.0#安装.netcore 运行时 (与 .NET 最兼容的运行时,包含运行环境但是不能对代码进行编译)
sudo yum install aspnetcore-runtime-6.0#安装不包含 ASP.NET Core 支持的 .NET 运行时
sudo yum install dotnet-runtime-6.0
- 查看安装的dotnet版本
6、应用程序部署
#1.安装 libgdiplus,对于使用 System.Drawing.Common 程序集的 .NET Core 应用,还需要依赖libgdiplus(版本 6.0.1 或更高版本),由于excel组件依赖了System.Drawing,所以需要安装libgdiplus
sudo yum install libgdiplus#2.发布后的后台程序修改 appname.runtimeconfig.json文件,在configProperties节点下加入"System.Drawing.EnableUnixSupport": true
{"runtimeOptions": {"configProperties": {"System.Drawing.EnableUnixSupport": true}}
}#3.上传到服务器,解压
unzip -O GBK publish.zip #使用GBK编码方式中文文件出现乱码#4.使用pm2进行进程守护
cd publish/ #进入程序根目录
pm2 start "dotnet CERE.WebApi.dll --urls 'http://*:5000' " --name webapi.dll #pm2监听
pm2 startup #开机启动
pm2 save #保存#5.打包前端程序上传到服务器
unzip -O GBK dist.zip #使用GBK编码方式中文文件出现乱码#6.配置nginx转发
cd /etc/nginx/
vi nginx.conf#7.修改配置后重启
nginx -t #检查语法
nginx -s reload #重启nginx让配置生效#8.防火墙开放nginx前后端对应端口(云服务器也要开放)
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=90/tcp --permanent
firewall-cmd --reload #8.访问系统
curl http://124.220.78.52:5000/api/helper/test #服务器测试接口http://124.220.78.52 #测试站点
-
CERE.WebApi.runtimeconfig.json文件新增配置
-
云服务器防火墙开放端口
-
nginx 配置文件如下
#前端vue配置
server {listen 80;server_name 127.0.0.1;location / {root /home/App/dist; #vue文件目录try_files $uri $uri/ /index.html; #解决刷新404的问题index index.html index.htm;} #这里注意发布的时候,前端配置的后台接口地址直接配前端地址,这里进行转发到后台地址,来解决跨域问题location /api/ { # API Serverproxy_pass http://124.220.78.52:90; #将后台接口的请求代理到真实的服务器地址proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade; proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}#后端.netcore配置
server {listen 90;server_name 127.0.0.1;location / {root html;proxy_pass http://127.0.0.1:5000; #后台接口启动地址端口index index.html index.htm;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection keep-alive;proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}
问题
-
Q1:修改nginx配置后重启服务出错 nginx: [emerg] bind() to 0.0.0.0:8088 failed (13: Permission denied)
- 1.查看getenforce #如果是enabled表示开启,这个必须关闭,会造成很多不确定的权限问题
- 2.临时关闭 :setenforce 0
- 3.彻底关闭:修改/etc/selinux/config文件中的SELINUX="" 为 disabled ,然后重启reboot。
-
Q2:访问前端地址失败
- 1.检查nginx配置前端文件路径是否正确
- 2.检查防火墙是否开放对应端口,云服务器防火墙是否开放对应端口
- 3.查看nginx日志
-
Q3:前端访问后台接口报错
- 1.检查nginx配置的后台接口地址端口是否开放
- 2.查看pm2程序日志
-
Q4:接口连接数据库失败 MySqlConnector.MySqlException (0x80004005): Table '****' doesn't
- 修改数据库配置 etc/my.cnf 在[mysqld]下添加配置: lower_case_table_names = 1
-
连接数据库失败
7、修改服务器地址
#修改网络配置文件中的ip,dns 等信息
vi /etc/sysconfig/network-scripts/ifcfg-eth0#前端项目需要修改配置重新打包#后端项目需要修改appsetting.json的连接配置