跟着TRAE SOLO全链路看看项目部署服务器全流程吧
接下来我们新建一个项目,然后将项目部署到服务器上,并且配置好以后可以在外网进行访问
bash
安装nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
1、简单服务器环境搭建
接下来我们就实现把 Node.js 项目部署到/opt/nexus-node-api并配置外部访问
进入服务器以后安装环境
bash
# 更新包列表
sudo apt update
# 安装 Node.js 和 npm
sudo apt install nodejs npm
# 验证安装
node --version
npm --version
项目创建
bash
# 创建目录
sudo mkdir -p /opt/nexus-node-api
# 设置所有者和权限
sudo chown -R $USER:$USER /opt/nexus-node-api
chmod -R 755 /opt/nexus-node-api
# 进入目录
cd /opt/nexus-node-api
# 创建一个项目
nano app.js
项目内容
javascript
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World!\n');
});
server.listen(3000, '0.0.0.0', () => {
console.log(`Server running on port 3000`);
});
测试运行以及外网访问
注意点:一定要注意这个时候必须保证你的服务器里面的防火墙(安全组)规则里面有3000这个端口号
perl
node app.js
现在访问 http://你的服务器IP:3000 应该能看到 "Hello World!"
2、正式项目配置
卸载node环境
这里我们使用nvm来配置我们的环境,如果已经有的,我们删除一下已经有的环境
csharp
# 卸载 nodejs 和 npm
sudo apt-get remove nodejs npm
sudo apt-get purge nodejs npm
安装nvm
bash
// 安装 nvm
# 建议安装 nvm,方便版本管理
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
配置环境变量
bash
# 编辑 .bashrc
nano ~/.bashrc
//添加配置 ---一般系统会自动为我们添加
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion"
// 重新加载配置
source ~/.bashrc
// 验证 nvm 安装
nvm --version
安装稳定版本node
csharp
ubuntu为例子
// 查看可以安装的稳定版本
nvm ls-remote
// 这里我安转版本
nvm install v22.12.0
// 使用
nvm use v22.12.0
// 设置默认版本
nvm alias default v22.12.0
// pm2
npm i -g pm2
使用pm2守护进程
PM2 是 Node 应用的进程管理工具,能保证服务在后台持续运行:要不然关闭窗口之后,就无法访问了
bash
# 全局安装 PM2
npm install pm2 -g
# 启动服务并命名(方便管理)
pm2 start app.js --name "node-api-nexus"
# 查看服务状态
pm2 list # 若 Status 为 online 则表示启动成功
这个时候不管怎么刷新我们的页面或者窗口,可以始终稳定访问我们的接口
pm2 重启对应的服务
arduino
pm2 restart "node-api-nexus"
3、服务器安装mysql数据库
环境搭建
接下来我们在服务器上安装mysql数据库,这里需要我们输入服务器密码
csharp
# 更新包列表
sudo apt update
# 安装 MySQL 服务器
// 安装 MySQL 8.0(Ubuntu 默认源即提供 MySQL 8.0)
sudo apt install mysql-server -y
# 安装过程中可能会提示输入服务器密码
# 确认 MySQL 版本
mysql --version
MYSQl数据库安全配置
调整 MySQL 服务器的安全性
csharp
# 安全配置(可选但推荐)
sudo mysql_secure_installation
测试可以都选n
按照提示配置:
是否启用强密码 // y
设置 root 密码 // Le@1996#Lin
移除匿名用户
禁止远程 root 登录(可选)
删除测试数据库
重新加载权限表
css
登录 MySQL
sudo mysql -u root -p
输入密码即可
配置远程访问(可选)
ini
配置 MySQL 允许本地连接:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
配置信息
[mysqld]
# 确保绑定到本地
bind-address = 127.0.0.1
# 设置端口
port = 3306
# 设置字符集
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
修改mysql数据库配置
ini
[mysqld]
# 注释掉原来的 bind-address 或改为 0.0.0.0
# bind-address = 127.0.0.1
bind-address = 0.0.0.0
port = 3306
重启服务,登录mysql创建远程连接用户
sql
// 重启mysql服务
sudo systemctl restart mysql
// 登录
sudo mysql -u root -p
// 密码
123456
-- 创建远程用户(% 表示允许任何IP连接)
CREATE USER '账号'@'%' IDENTIFIED BY '密码';
-- 授予权限
GRANT ALL PRIVILEGES ON *.* TO '密码'@'%' WITH GRANT OPTION;
-- 或者只授权特定数据库(跳过)
-- GRANT ALL PRIVILEGES ON your_database.* TO 'remote_user'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
-- 查看用户
SELECT User, Host FROM mysql.user;
-- 退出
EXIT;
// 重启 MySQL
sudo systemctl restart mysql
// 设置开机自启(默认应已设置)
sudo systemctl enable mysql
4、navicat远程mysql数据库
切记:一定要保证我们的服务器已经添加了我们的端口3306
服务器允许我们远程连接
python
# 开放 3306 端口
sudo ufw allow 3306
# 或者只允许特定IP访问(更安全)
sudo ufw allow from 你的本地IP to any port 3306
# 查看防火墙状态
sudo ufw status
远程连接
本地远程mysql数据库,我使用的是navicat工具,这里直接输入我们的信息
连接名:远程服务器,随便起名字
主机:服务器IP
用户名:上面设置的
密码:上面设置的

测试一下,服务器的数据库已经连接成功了
数据库连接测试
新建一个数据库,这里我的名称是nexus
数据库名:nexus
字符集:utf8mb3
排序规则:utf8mb3_bin
新建一个表
sql
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
`user_id` int(0) NOT NULL AUTO_INCREMENT COMMENT 'id',
`name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '姓名',
`age` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '年龄',
`sex` int(0) NULL DEFAULT NULL COMMENT '用户性别 1男 2女 ',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`address` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '用户的地址',
`state` tinyint(0) NULL DEFAULT NULL COMMENT '1 正常 0 2 禁用',
`phone` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '手机号',
`username` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '用户的登录账号',
`password` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT '123456' COMMENT '用户的登录密码',
`avatar` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '头像地址',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
`user_height` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '身高',
`user_weight` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '体重',
`disease` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '健康状况,是否有疾病',
PRIMARY KEY (`user_id`, `password`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 55 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;
本地运行项目测试
这里我们现在就本地启动项目连接我们服务器,然后进行测试,这里我以开源的Node项目为例,主要修改四个参数
ini
const dbhost='xx'; // 数据库主机地址,如果是本地数据库则使用localhost
const dbdatabase='xx'; // 数据库名称
const dbuser='xx'; // 数据库用户名
const dbpassword='xxx'; // 数据库密码
本地测试一下,我们的线上数据库已经可以使用了
5、Node项目部署
接下来我们将node项目部署进我们的服务器,首先把我们项目都扔进去
配置环境
这里我用的是yarn,安装一下
arduino
npm install yarn -g
// 配置环境
yarn
// 启动pm2
pm2 start app.js --name "node-api-nexus"
// 重新启动pm2 设置开机自启
pm2 startup
pm2 save
查看详细日志
pm2 logs node-api-nexus
启动以后我们就可以直接在浏览器打开地址对我们的系统后台进行访问了
arduino
http://XXXXXX:3200/
6、前端部署
环境安装
接下来我们继续部署我们的前端应用,先用我们的项目连接一下我们的数据库尝试一下 OK,没什么问题,然后我们开始部署前端项目
arduino
项目名称为nexus-vue,项目打包好的路径位于 /opt/nexus-vue 下面
// 打包前端项目
yarn build
// 更新和安装nginx
// 更新可以跳过 之前我们已经进行过
sudo apt update
sudo apt install nginx
// 查看版本
nginx -V
配置nginx
bash
sudo nano /etc/nginx/sites-available/nexus-vue
// 配置如下
server {
listen 80;
server_name localhost; # 替换为你的域名或IP
root /opt/nexus-vue;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
# 如果需要代理API请求
location /api {
proxy_pass http://localhost:3000;
}
}
server {
listen 8080;
server_name localhost; # 替换为你的域名或IP
# 前端静态文件
root /opt/nexus-vue;
index index.html;
# 前端路由
location / {
try_files $uri $uri/ /index.html;
}
# 后端API请求
location /api {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
# WebSocket连接
location /ws {
proxy_pass http://localhost:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
开放接口
yaml
sudo ufw allow 8080
sudo systemctl restart nginx
处理日志错误
ruby
// 检查nginx错误日志
sudo tail -f /var/log/nginx/error.log
//开放文件权限
sudo chmod -R 755 /opt/nexus-vue
// 检查配置
sudo nano /etc/nginx/sites-available/nexus-vue
// 重新启动nginx
sudo systemctl restart nginx
部署
写一个测试页面扔进去
xml
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>我是测试页面</title>
</head>
<body>
<h1>我是测试页面</h1>
</body>
</html>
访问我们的地址http://域名IP:8080/
这个时候已经可以看到我们的项目已经部署上去了
重新加载以后,ok,到这里我们全链路都部署上去了
