最近弄了一个Node.js项目,包含前端用户前台,管理后台和服务端API服务三个项目,本地搭建好了,于是在腾讯云上新建了个Ubuntu 24.04服务器,想要将本地的Node.js项目部署上去,包括环境配置和数据库搭建。
本文主要讲解如何部署Node.js项目,通常需要以下步骤:
-
服务器初始设置(创建用户,SSH配置,防火墙)
-
安装Node.js和npm
-
安装和配置数据库(MySQL/MongoDB)
-
部署项目代码(通过Git或SCP)
-
安装项目依赖,配置环境变量
-
使用PM2管理进程
-
配置Nginx反向代理(可选)
-
配置SSL证书(可选)
-
最终测试和故障排除
现在,开始第一步,服务器初始设置。我们需要创建新用户、配置SSH密钥、更新系统包,并设置防火墙。
第1步:服务器初始设置(安全与基础配置)
1.1 登录服务器
- 使用SSH登录到你的腾讯云服务器(替换
your_username
和your_server_ip
):ssh root@your_server_ip
📌 如果是首次登录,腾讯云可能要求你通过Web控制台重置root密码或使用SSH密钥。
1.2 创建新用户(避免使用root)
# 创建新用户(例如命名为deploy)
sudo adduser deploy# 赋予sudo权限
sudo usermod -aG sudo deploy# 切换到新用户
su - deploy
1.3 配置SSH密钥登录(提高安全性)
- 本地机器操作:生成SSH密钥(如果已有可跳过):
ssh-keygen -t ed25519
- 将公钥上传到服务器(替换
your_server_ip
):ssh-copy-id deploy@your_server_ip
- 禁用密码登录(可选但推荐):
找到并修改:sudo nano /etc/ssh/sshd_config
重启SSH服务:PasswordAuthentication no
sudo systemctl restart sshd
1.4 更新系统
sudo apt update && sudo apt upgrade -y
1.5 配置防火墙(UFW)
sudo ufw allow OpenSSH # 允许SSH
sudo ufw allow 80 # HTTP端口(后续Web服务)
sudo ufw allow 443 # HTTPS端口
sudo ufw enable # 启用防火墙
sudo ufw status # 检查规则
第2步:安装Node.js环境
2.1 安装Node.js(推荐使用LTS版本)
Ubuntu 24.04 默认仓库中的Node.js可能不是最新版本,建议通过NodeSource安装指定版本(以Node.js 18.x为例):
# 下载并运行NodeSource安装脚本
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -# 安装Node.js和npm
sudo apt install -y nodejs# 验证安装
node -v # 应输出 v18.x.x
npm -v # 应输出对应版本
📌 如果需要其他版本(如20.x),替换脚本中的
setup_18.x
为setup_20.x
,详见 NodeSource文档。
2.2 安装PM2(进程管理工具)
PM2 用于守护Node.js进程,确保应用崩溃或重启后自动运行:
sudo npm install -g pm2# 验证安装
pm2 --version
2.3 配置项目依赖(可选,后续步骤会详细操作)
如果已有项目的package.json
,可提前安装依赖:
# 假设项目目录为/home/deploy/app
cd /home/deploy/app
npm install --production
好的!接下来是 第3步:部署代码到服务器。这一步需要将本地的Node.js项目代码上传到服务器的 /home/lifire
目录。以下是具体操作:
第3步:部署代码到服务器
3.1 将本地代码传输到服务器
有两种常用方法:SCP(直接复制文件)或 Git(从仓库拉取)。选择其中一种方式操作。
方法1:使用SCP传输文件(推荐简单项目)
- 本地机器操作(替换
/your/local/path
为本地项目路径,your_server_ip
为服务器IP):# 传输整个项目目录到服务器的 /home/lifire scp -r /your/local/project/path deploy@your_server_ip:/home/lifire/# 示例: # scp -r ./my-node-app deploy@123.45.67.89:/home/lifire/
📌 输入服务器用户
deploy
的密码(如果配置了SSH密钥则无需密码)。
方法2:使用Git克隆仓库(推荐已有Git管理的项目)
- 服务器操作(确保已安装Git):
# 安装Git sudo apt install git -y# 进入项目目录 cd /home/lifire# 克隆你的Git仓库(替换为你的仓库URL) git clone https://github.com/yourusername/your-repo.git .# 如果是私有仓库,配置SSH密钥: # 1. 在服务器生成SSH密钥(一路回车): # ssh-keygen -t ed25519 # 2. 将公钥 `cat ~/.ssh/id_ed25519.pub` 添加到GitHub/GitLab的SSH Keys设置中
3.2 安装项目依赖
- 服务器操作:
# 进入项目目录 cd /home/lifire# 安装依赖(根据项目实际情况选择) npm install # 安装所有依赖(开发+生产) # 或 npm install --production # 仅安装生产依赖
3.3 配置环境变量(如有需要)
如果项目使用了环境变量(如数据库密码、API密钥),需在服务器配置:
# 创建.env文件(示例)
nano .env# 填写你的环境变量,例如:
# DB_HOST=localhost
# DB_USER=root
# DB_PASSWORD=your_password
按 Ctrl+O
保存,Ctrl+X
退出。
3.4 启动项目(使用PM2守护进程)
# 进入项目目录
cd /home/lifire# 启动项目(假设入口文件为app.js)
pm2 start app.js --name "my-node-app"# 设置PM2开机自启动
pm2 save
pm2 startup
# 执行最后一行输出的命令(例如 `sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u deploy --hp /home/deploy`)
3.5 验证服务是否运行
# 查看PM2进程列表
pm2 list# 检查应用日志
pm2 logs my-node-app
如果看到应用正常启动且无报错,说明部署成功。
3.6 开放应用端口(如3000、8080等)
如果项目监听的是非80/443端口(例如3000),需开放防火墙:
sudo ufw allow 3000
sudo ufw reload
第4步:配置MySQL数据库
4.1 安装MySQL Server
# 更新软件包列表
sudo apt update# 安装MySQL Server
sudo apt install mysql-server -y# 验证安装
sudo systemctl status mysql
- 如果状态显示
active (running)
,说明安装成功。
4.2 运行安全配置脚本
sudo mysql_secure_installation
按提示操作:
- 设置密码强度验证插件(建议选择
Y
)。 - 设置root用户密码(输入一个强密码并记住)。
- 移除匿名用户(选择
Y
)。 - 禁止远程root登录(选择
Y
)。 - 移除测试数据库(选择
Y
)。 - 重新加载权限表(选择
Y
)。
4.3 登录MySQL并创建专用数据库和用户
# 以root身份登录MySQL(使用刚设置的密码)
sudo mysql -u root -p
在MySQL命令行中执行以下操作(替换 your_db_name
、your_db_user
和 your_db_password
):
-- 创建数据库
CREATE DATABASE your_db_name;-- 创建专用用户并设置密码(推荐强密码)
CREATE USER 'your_db_user'@'localhost' IDENTIFIED BY 'your_db_password';-- 授予用户对数据库的完全权限
GRANT ALL PRIVILEGES ON your_db_name.* TO 'your_db_user'@'localhost';-- 刷新权限
FLUSH PRIVILEGES;-- 退出MySQL
EXIT;
4.4 配置MySQL允许远程访问(可选)
如果Node.js应用与MySQL不在同一服务器,需开放远程访问(注意:仅限内网环境或配置IP白名单):
# 修改MySQL配置文件
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
找到 bind-address
并修改为:
bind-address = 0.0.0.0
重启MySQL服务:
sudo systemctl restart mysql
然后开放防火墙端口:
sudo ufw allow 3306
4.5 在Node.js项目中配置数据库连接
在项目的 .env
文件中添加数据库信息:
DB_HOST=localhost
DB_PORT=3306
DB_USER=your_db_user
DB_PASSWORD=your_db_password
DB_NAME=your_db_name
4.6 测试数据库连接
在Node.js代码中,使用 mysql2
或 sequelize
等库测试连接:
const mysql = require('mysql2/promise');async function testConnection() {const connection = await mysql.createConnection({host: process.env.DB_HOST,user: process.env.DB_USER,password: process.env.DB_PASSWORD,database: process.env.DB_NAME});console.log('数据库连接成功!');await connection.end();
}testConnection().catch(console.error);
运行测试:
node test-db.js
如果输出 数据库连接成功!
,说明配置正确。
关键注意事项
- 安全建议:
- 不要使用root用户直接连接应用。
- 生产环境避免开放MySQL到公网,建议通过内网或SSH隧道访问。
- 备份数据库:
mysqldump -u your_db_user -p your_db_name > backup.sql
第5步:配置Nginx反向代理
5.1 安装Nginx
sudo apt install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx # 设置开机自启
5.2 配置反向代理
-
创建Nginx配置文件(替换
your_domain.com
为你的域名或服务器IP):sudo nano /etc/nginx/sites-available/your_domain.conf
-
粘贴以下配置(假设Node.js运行在
127.0.0.1:3000
):server {listen 80;server_name your_domain.com www.your_domain.com; # 无域名可改为 server_name _;location / {proxy_pass http://127.0.0.1:3000; # 转发到Node.js端口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;}# 静态文件处理(可选)location /static/ {alias /home/lifire/blog-server/static/;expires 30d;}# 错误页面配置error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;} }
-
保存并退出(
Ctrl+O
→Enter
→Ctrl+X
)。
5.3 启用配置并测试
# 创建符号链接到sites-enabled目录
sudo ln -s /etc/nginx/sites-available/your_domain.conf /etc/nginx/sites-enabled/# 测试Nginx配置语法
sudo nginx -t # 应显示 "test is successful"# 重启Nginx
sudo systemctl restart nginx
5.4 配置防火墙(如果未开放80/443端口)
sudo ufw allow 'Nginx Full' # 允许HTTP(80)和HTTPS(443)
sudo ufw reload
5.5 验证反向代理
访问 http://your_domain.com
或 http://服务器IP
,应显示Node.js应用页面。
可选:配置HTTPS(Let’s Encrypt免费证书)
5.6 安装Certbot
sudo apt install certbot python3-certbot-nginx -y
5.7 获取SSL证书
sudo certbot --nginx -d your_domain.com -d www.your_domain.com
按提示操作(输入邮箱、同意条款等),Certbot会自动修改Nginx配置并启用HTTPS。
5.8 验证证书自动续签
sudo certbot renew --dry-run # 模拟续签测试
关键检查点
-
Nginx状态:
systemctl status nginx # 确保状态为 "active (running)"
-
防火墙规则:
sudo ufw status # 确保80和443端口允许
-
Node.js应用监听地址:
确保Node.js应用绑定到0.0.0.0
或127.0.0.1
,而非仅本地回环地址。例如:app.listen(3000, '0.0.0.0', () => {console.log('Server running on port 3000'); });
第6步:部署后的优化与监控
6.1 启用PM2集群模式(提升性能)
如果你的应用支持多进程,使用PM2集群模式充分利用多核CPU:
# 停止现有应用
pm2 delete blog-server-v2# 启动集群模式(假设使用4个进程)
pm2 start app.js -i 4 --name "blog-server-v2"# 保存配置
pm2 save
6.2 配置日志轮转(防止日志占满磁盘)
-
安装PM2日志轮转模块:
pm2 install pm2-logrotate pm2 set pm2-logrotate:max_size 100M # 单个日志最大100MB pm2 set pm2-logrotate:retain 30 # 保留30个历史日志
-
手动触发日志切割:
pm2 flush # 清理旧日志
6.3 设置基础监控
-
PM2内置监控:
pm2 monit # 实时查看进程资源占用
-
系统级监控(推荐安装
htop
):sudo apt install htop htop # 查看CPU、内存、进程详情
6.4 配置自动化备份
-
备份数据库(每日凌晨3点备份):
# 创建备份脚本 nano ~/backup-db.sh
内容:
#!/bin/bash mysqldump -u your_db_user -p'your_db_password' your_db_name > /home/deploy/backups/db_$(date +\%Y\%m\%d).sql
# 赋予执行权限 chmod +x ~/backup-db.sh# 添加定时任务 crontab -e
添加一行:
0 3 * * * /home/deploy/backup-db.sh
-
备份项目代码(每周日备份):
crontab -e
添加:
0 4 * * 0 tar -czf /home/deploy/backups/app_$(date +\%Y\%m\%d).tar.gz /home/lifire/blog-server
6.5 安全加固
-
定期更新系统:
# 配置自动安全更新 sudo apt install unattended-upgrades sudo dpkg-reconfigure unattended-upgrades # 选择"Yes"
-
防火墙加固:
sudo ufw deny 3306 # 禁止MySQL默认端口暴露(如果之前开放过) sudo ufw limit OpenSSH # 防止SSH暴力破解
6.6 配置健康检查端点(可选)
在Node.js应用中添加一个健康检查路由:
app.get('/health', (req, res) => {res.status(200).json({ status: 'ok', timestamp: Date.now() });
});
然后通过Nginx或外部监控服务定期访问 http://your_domain.com/health
确认应用存活。
后续建议
-
持续集成/部署(CI/CD):
可配置GitHub Actions或Jenkins,实现代码推送后自动部署。 -
高级监控:
使用 Prometheus + Grafana 或 New Relic 监控应用性能。 -
负载均衡:
流量大时,可在腾讯云添加多个服务器并使用负载均衡器。
至此,你的Node.js应用已完成完整部署!