将 Node.js 项目部署到云服务器(如阿里云 ECS、腾讯云 CVM、AWS EC2 等)的完整流程通常包含以下关键步骤。以下以 Ubuntu 20.04/22.04 为例,采用主流生产级方案(PM2 + Nginx + HTTPS):
✅ 一、前期准备
-
购买并配置云服务器
- 选择操作系统(推荐 Ubuntu LTS)
- 开放必要端口:
22(SSH)、80(HTTP)、443(HTTPS)、自定义端口(如3000) - 配置安全组/防火墙规则
-
本地准备项目
- 确保项目依赖已打包(
package.json存在) - 使用
.env管理敏感配置(避免硬编码) - 测试本地运行正常:
npm start或node app.js
- 确保项目依赖已打包(
✅ 二、上传代码到服务器
方式一:Git 拉取(推荐)
# 在服务器上克隆仓库
git clone https://github.com/yourname/your-project.git /var/www/your-project
cd /var/www/your-project
方式二:SCP/SFTP 传输
# 本地执行
scp -r ./dist/* user@your-server:/var/www/your-project/
# 或使用 rsync 增量同步
rsync -avz ./ dist/ user@server:/var/www/your-project/
💡 建议:生产环境使用 Git 拉取 + CI/CD 自动部署更可靠。
✅ 三、安装基础依赖
# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装 Node.js(推荐用 nvm 或官方源)
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
# 验证版本
node -v # 应 ≥ v18 LTS
npm -v
# 安装 PM2(进程管理器)
sudo npm install -g pm2
⚠️ 注意:优先使用
nvm管理多版本 Node,避免全局污染:curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash nvm install --lts
✅ 四、安装并配置数据库(如需)
- MySQL/MariaDB:
sudo apt install mysql-server sudo mysql_secure_installation - PostgreSQL:
sudo apt install postgresql postgresql-contrib - 创建数据库与用户,导入 schema(
.sql文件或通过 ORM 迁移)
🔐 修改默认密码!禁止 root 远程登录。
✅ 五、配置应用环境变量
在项目根目录创建 .env 文件(切勿提交到 Git):
NODE_ENV=production
PORT=3000
DATABASE_URL=mysql://user:pass@localhost/dbname
JWT_SECRET=your-secret-key
REDIS_URL=redis://localhost:6379
启动时加载:
pm2 start app.js --env production
# 或配置 package.json scripts:
# "start": "pm2 start app.js --env production"
✅ 六、使用 PM2 启动应用
# 启动应用(假设主入口为 app.js)
pm2 start app.js --name my-app --env production
# 查看状态
pm2 status
pm2 logs my-app
# 设置开机自启
pm2 startup
pm2 save
✅ 推荐配置 ecosystem.config.js 实现统一管理:
module.exports = {
apps: [{
name: 'my-app',
script: 'app.js',
instances: 2, // 多实例负载均衡
exec_mode: 'cluster',// 集群模式
env: {
NODE_ENV: 'production',
PORT: 3000
},
error_file: './logs/error.log',
out_file: './logs/out.log'
}]
};
// 启动:pm2 start ecosystem.config.js
✅ 七、反向X_X:Nginx 配置(必备)
1. 安装 Nginx
sudo apt install nginx -y
2. 创建站点配置 /etc/nginx/sites-available/my-app
server {
listen 80;
server_name your-domain.com www.your-domain.com;
location / {
proxy_pass http://127.0.0.1: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;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# 静态资源缓存优化
location /static/ {
alias /var/www/your-project/dist/static/;
expires 30d;
add_header Cache-Control "public, immutable";
}
}
3. 启用站点 & 重载
sudo ln -s /etc/nginx/sites-available/my-app /etc/nginx/sites-enabled/
sudo nginx -t # 检查配置语法
sudo systemctl reload nginx
✅ 八、配置 SSL 证书(Let’s Encrypt 免费)
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d your-domain.com -d www.your-domain.com
✅ 自动完成:
- 生成证书
- 配置 HTTPS
- 自动续期(
certbot renew由 cron 定时执行)
✅ 九、安全加固建议
| 措施 | 操作 |
|---|---|
| 禁用 root SSH 登录 | /etc/ssh/sshd_config → PermitRootLogin no |
| 改用密钥认证 | ssh-keygen + authorized_keys |
| 安装 fail2ban | sudo apt install fail2ban |
| 限制 IP 访问 | UFW 防火墙:ufw allow from 1.2.3.4 to any port 22 |
| 定期更新系统 | unattended-upgrades 启用自动安全补丁 |
✅ 十、监控与维护
- 日志监控:
pm2 logs,journalctl -u nginx - 性能监控:
- 轻量:
htop,pm2 monit - 专业:Prometheus + Grafana + Node Exporter
- 轻量:
- 备份策略:
- 数据库每日自动备份(mysqldump/pg_dump + cron)
- 代码通过 Git 历史保留
- 重要数据异地存储(如 OSS/S3)
🔄 可选进阶:CI/CD 自动化部署
使用 GitHub Actions + SSH 自动部署:
# .github/workflows/deploy.yml
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Deploy via SSH
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USER }}
key: ${{ secrets.SSH_KEY }}
script: |
cd /var/www/your-project
git pull origin main
npm ci --only=production
pm2 restart my-app
需要我针对你的具体场景(如:使用 Docker?TypeScript 项目?微服务架构?)提供定制化部署脚本或配置文件模板吗?
CLOUD技术博