前言

前段时间在用node.js写一个后端项目,后面就想着线上部署一下吧,然后就遇见了各种坎坷磨难,一言难尽

购买服务器

首先,既然要搭建服务器那么最起码我们得有一个服务器,物理服务器太麻烦了,果断选择云服务器,虽然我是实物主义,云服务器并不符合实物主义,但物理服务器确实过于繁琐,先不论财力支出,时间成本过于高昂,并不符合我的初衷。

我是在阿里云买的ECS云服务器,阿里云有学生优惠,学生认证后,购买服务器可以便宜很多,官网地址是:https://www.aliyun.com/ 然后选择的是Ubuntu的镜像源

第一次踩坑:
第一次买没什么经验然后发现,如果大家买的地域是国内的,且想用https协议那么就需要备案,过程漫长而繁琐,http不需要备案。如果地域是香港或者新加坡的则无此担忧。
此外,大家务必注意买的服务器是否具有官网IP,当时我买的时候没注意导致了后续得额外购买弹性公网,不过也有别的解决办法,可以通过内网穿透来实现,但需要额外配置,这里就不展开了,大家自行百度吧。(狠狠吐糟,居然还有没有弹性公网的,当时和朋友说的时候他也表示无语)

部署

基础配置

已经实现了服务器购买后,必然是连接服务器,我们可以通过阿里云官网直接实现远程连接,一般是先通过密码登录(但存在安全隐患),后续配置好密钥后则直接通过密钥登录(请务必不要泄露自己的密钥信息)

中途的操作如若看不懂可以直接默认回车

建立连接后输入 apt update 更新系统软件包,更新完成后输入 apt upgrade -y安装更新

上述提到了如若密码登录会存在安全隐患,可以配置密钥登录,具体操作如下:

  1. 在本地电脑生成密钥对,输入 ssh-keygen,然后一路回车,生成密钥对(可以选择对密钥进行加密
  2. 将公钥复制,公钥存放于C:\Users\用户名.ssh\id_rsa.pub
  3. 在服务器上添加密钥对,名称自取,选择导入已有的密钥对,将公钥粘贴进去,保存
  4. 绑定密钥对,选择需要绑定密钥对的实例,点击绑定密钥对,选择刚刚添加的密钥对,然后绑定
  5. 重启服务器

为了避免多个服务器每次连接都需要去寻找IP地址可以在 C:\Users\用户名\.ssh 文件夹下新建config文件(文件名不要带后缀),将以下内容模板粘贴进去,然后保存

1
2
3
Host 名称
HostName 服务器公网IP
User root

然后就可以通过 ssh 名称 来连接服务器了

安装宝塔面板

文档地址:https://www.bt.cn/new/download.html

我选择的是 Ubuntu/Deepin 的脚本

第二次踩坑:安全组后续配置可以选择全部放通,不然可能会导致请求访问不了

安装完成请妥善保管宝塔面板的账号密码,后续需要通过浏览器访问面板,安装完成后可以去设置服务器安全组,备注一个授权对象为IPv(0.0.0.0/0),端口为宝塔安装完成后提示放行的端口,然后保存,后续可以通过该端口访问面板

安装面板配置

我是用Node.js写的后端项目,所以需要安装Node.js,如果你是Java或者别的语言请自行配置

  • Node.js版本管理器(安装最新的稳定版即可,安装完成后记得命令行版本启用安装的Node.js
  • Nginx(安装最新版即可
  • Mysql(安装最新版或者5.7.xx版本即可,安装完成后记得设置数据库密码,后续需要使用

项目部署

注意一些相关的环境配置

将项目上传到服务器存放于(/www/wwwroot),通过clone可能会遇见ssh问题,或者直接通过本地上传项目文件

连接数据库

复制宝塔面板的root数据库密码,然后更新项目config文件的相关配置,后续创建相应的数据库和表,然后重启项目即可

详细的配置可以看视频: https://www.bilibili.com/video/BV1HE42157zV?p=46&spm_id_from=pageDriver&vd_source=3ff70252a34a52e490698c049f2d0654

添加DNS解析

查看视频: https://www.bilibili.com/video/BV1HE42157zV?p=47&vd_source=3ff70252a34a52e490698c049f2d0654 即可,
配置完解析记录后,我们可以去面板添加Node项目

部署前端文件

将前端文件打包后,上传到服务器存放于(/www/wwwroot),然后通过Nginx配置文件进行配置,配置完成后重启Nginx即可

注意:前端项目一般都是SPA单文件组件,需额外配置

1
2
3
4
5
 location / {
root /www/wwwroot/${前端访问文件}; # 替换为你的React项目构建输出目录
index index.html index.htm;
try_files $uri $uri/ /index.html; # 这行是关键,确保所有请求都指向index.html
}