.Net项目部署全流程

199 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

.Net项目部署全流程

最近在学校进行实训,做好了一个CMS文章管理系统,想要部署到云服务器上,结果出现了许多问题,总结一下以免下次再出现时手足无措,也分享给大家,可以一同探讨是否有更好的选择

前端使用vue全家桶和ElementUI进行构建,后端使用.Netcore webApi+EFcore进行构建,在本地测试完成之后。进行云服务器的部署

  1. 使用Debain 10系统
  2. 使用阿里云服务器
  3. 使用PM2
  4. 使用postgersql
  5. 使用Xshelll,XFTP
  6. 使用Nginx

前端配置

首先,在一个全新的云服务器上,想要提供网络访问服务的方式有很多,我选择使用Nginx作为代理解析服务器,首先就要在云服务器上安装Nginx

Nginx软件包内置了Debian 10默认软件存储库,因此安装非常轻松,您只需在终端中运行以下命令:
sudo apt update
sudo apt install nginx
安装Nginx之后,可以使用以下命令检查Nginx服务的状态:
sudo systemctl status nginx
您还可以使用以下命令检查Nginx Web服务器的版本:
sudo nginx -v

在安装之后,访问云服务地址,会出现Nginx的欢迎界面,出现这个界面,就说明成功安装Nginx了

image-20220805144510525

之后使用XFTP进行文件上传,我这边上传的地址是/var/www

image-20220805144658420

到这一步,就已经完成了一大半操作了。耐心走下去!!

下面是Nginx的配置文件设置,文件所在路径根据系统不同而不同,我使用的是Debian,所在路径为/etc/nginx/conf.d

使用Vim进行新建一个conf类型的文件,输入以下内容,完成前端前台页面的配置

server{
    # 输入普通地址时,跳转到https地址
    listen 80;
    server_name  cmsfront.meetfang.top;
    return 301 https://cmsfront.meetfang.top$request_uri;
}
​
server{
    listen 443;  #监听的端口
    server_name  cmsfront.meetfang.top ; #监听的域名
        ssl on;
    ssl_certificate /etc/nginx/ssl/8227653_cmsfront.meetfang.top.pem;//如果没有可以使用阿里云等运营商提供的免费证书
    ssl_certificate_key /etc/nginx/ssl/8227653_cmsfront.meetfang.top.key;   
    location / {
        root /var/www/front/frontend; #网站所在路径
        index index.html; #默认的首页文件
    }
}

使用以下命令进行测试

nginx -t 

出现以下命令提示,则为语法校验通过。(这里的语法校验通过并不指一定正确,只是语法没有错误)image-20220805145129391

输入以下命令,进行刷新Nginx

nginx -s reload

当然,现在还不可以访问,这是因为在域名解析方面,还未进行相应的配置,这里我使用的是阿里云,可以参考以下配置

image-20220805145411691

image-20220805145437262

image-20220805145513225

开放端口

image-20220805154851938

image-20220805154912510

image-20220805154928473

image-20220805155048160

完成这里的配置,前端的前台已经可以进行正常访问了,同样的操作也是适用于前端的后台

申请ssl免费证书可以参考以下流程

image-20220805145727426

image-20220805145801536

申请之后,下载Nginx版本的,解压之后就会得到以下两个文件,放在上述配置文件的对于文件夹中即可

image-20220805152339672

后端配置

首先,我使用.netcore 6 webapi,所以这里先要在云服务器中安装对应的SDK

这里请参考官方文档 docs.microsoft.com/zh-cn/dotne…

完成上述安装,之后来安装pm2,由于pm2是依赖于node.js,所以我们先安装以下node.js

安装

进入官网 www.postgresql.org/

image-20220327213956060

然后download

image-20220327214022693

# Create the file repository configuration:
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'# Import the repository signing key:
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
​
# Update the package lists:
sudo apt-get update
​
# Install the latest version of PostgreSQL.
# If you want a specific version, use 'postgresql-12' or similar instead of 'postgresql':
sudo apt-get -y install postgresql

完成上面四条命令之后,就已经成功安装了

但是在你安装好了之后,还不能远程连接,要配置一下

cd /etc/postgresql/14/main
这里面的pg_hba.conf,需要增加一条记录
postgresql.conf ,需要查找listen 改为'*'表示接受所有

image-20220327214718032

这样就可以了

安装nodejs

这又是一个坑

我这边一开始是按照教程来的

也就是先下载xz的压缩包,然后上传到服务器。解压安装,设置软连接,但是!软连接不行啊。不知道咋整,他一直显示找不到命令。嘿嘿,这不行,我换了一个简单的

apt get install nodejs
//这里安装的nodejs是老版本,10版本的,且没有npm
//我就想到了nvm啊。这不简简单单吗
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
or Wget:
​
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash   (推荐wget)
然后 
source ~/.bashrc

然后通过了nvm 安装最新版就行了

nvm install stable

安装pm2

pm2是一个 NODE.JS 的高级生产过程管理器,使用它可以帮助我们轻松的部署运行 Node 项目

npm install pm2 -g

安装完成后会自动安装到我们的 node 目录下,同样的需要个给pm2 建立一个软链接

ln -s /usr/local/node/bin/pm2 /usr/local/bin

下面是 pm2 的一些常用命令

启动:pm2 start demo.js  //demo.js是你要启动的app_name|app_id文件
停止:pm2 stop app_name|app_id
删除:pm2 delete app_name|app_id
重启:pm2 restart app_name|app_id
停止所有:pm2 stop all
查看所有的进程:pm2 list
查看所有的进程状态:pm2 status
查看某一个进程的信息:pm2 describe app_name|app_id
参数说明
--watch:监听应用目录源码的变化,一旦发生变化,自动重启。如果要精确监听、不见听的目录,最好通过配置文件
-i --instances:启用多少个实例,可用于负载均衡。如果-i 0或者-i max,则根据当前机器核数确定实例数目,可以弥补node.js缺陷
--ignore-watch:排除监听的目录/文件,可以是特定的文件名,也可以是正则。比如--ignore-watch="test node_modules "some scripts"
-n --name:应用的名称,查看应用信息的时候可以用到
-o --output <path>:标准输出日志文件的路径,有默认路径
-e --error <path>:错误输出日志文件的路径,有默认路径
--interpreter <interpreter>:the interpreter pm2 should use for executing app (bash, python...)
如完整参数命令:
pm2 start demo.js --watch -i 2   //开启2个进程
pm2 start app.js -i max   //根据机器CPU核数,开启对应数目的进程 

完成之后,就可以进入对应的文件目录,比如我这里是借鉴DDD开发的,所以进入api目录

image-20220805153314665

输入命令

pm2 start "dotnet run" --name back

就可以成功运行了,输入pm2 list 查看状态

image-20220805153435610

这里也要同样的设置域名解析,还有Nginx的配置文件,参考上面的前端配置

server{
    # 输入普通地址时,跳转到https地址
    listen 80;
    server_name back.meetfang.top;
    return 301 https://back.meetfang.top$request_uri;
}
​
server{
    listen 443;  #监听的端口
    server_name back.meetfang.top; #监听的域名
            ssl on;
    ssl_certificate /etc/nginx/ssl/8227678_back.meetfang.top.pem;
    ssl_certificate_key /etc/nginx/ssl/8227678_back.meetfang.top.key;   
    location / {
        proxy_pass http://localhost:5000;//反向代理
    }
}

其他的坑

在前后端交互的时候,发现了这个问题

image-20220805153748258

image-20220805153805767

原来是由于项目改成了https协议的缘故,出现了请求被拦截;

其实是浏览器不允许在https页面里嵌入http的请求,现在高版本的浏览器为了用户体验,都不会弹窗报错,只会在控制台上打印一条错误信息。

解决方法

前端发请求的地址改为后端的https地址,解决

image-20220805154127851