将 Node.js 项目部署到云服务器(如阿里云、腾讯云、AWS EC2 等)的完整流程通常包含以下关键步骤。以下以 Linux 服务器(Ubuntu/Debian) 为例,采用主流生产级实践:
✅ 一、准备工作
-
购买并配置云服务器
- 选择操作系统(推荐 Ubuntu 20.04+ 或 CentOS 7+)
- 开放必要端口(默认 SSH: 22;应用端口如 3000;Nginx: 80/443)
- 配置安全组/防火墙规则(仅开放所需端口)
-
安装基础依赖
# 更新系统 sudo apt update && sudo apt upgrade -y # 安装 Node.js(推荐 via NodeSource 获取 LTS 版本) curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt install -y nodejs # 验证安装 node -v && npm -v # 安装 Git、PM2(进程管理器)、Nginx(反向X_X)、Let's Encrypt(可选 HTTPS) sudo apt install -y git nginx certbot python3-certbot-nginx
✅ 二、代码上传与初始化
方案 A:Git 拉取(推荐)
cd /var/www/my-app
sudo mkdir -p my-app
sudo chown $USER:$USER my-app
git clone <your-repo-url> .
# 或先 clone 再迁移权限
方案 B:SCP/SFTP 上传本地打包文件
# 本地压缩项目(排除 node_modules/.env 等敏感信息)
tar czf app.tar.gz --exclude='node_modules' --exclude='.env' --exclude='logs' .
# 上传到服务器
scp app.tar.gz user@your-server:/tmp/
# 解压并设置权限
ssh user@your-server 'cd /var/www/my-app && tar xzf /tmp/app.tar.gz && chown -R $USER:$USER .'
⚠️ 注意事项
- 不要直接上传
node_modules(跨平台兼容性问题大),应在服务器上执行npm ci或npm install --production - 敏感配置(如
.env)通过环境变量或密钥管理服务注入,避免提交到 Git
✅ 三、安装依赖 & 构建
cd /var/www/my-app
# 安装依赖(生产模式)
npm ci --only=production # 若 package-lock.json 存在(推荐)
# 或
npm install --production
# 若有前端构建(如 React/Vue)
npm run build
# 检查启动脚本
cat package.json | grep '"start"'
# 示例:"start": "node server.js" 或 "start": "node dist/index.js"
✅ 四、使用 PM2 管理进程(核心!)
# 全局安装 PM2
sudo npm install -g pm2
# 启动应用
pm2 start ecosystem.config.js # 推荐配置文件方式
# 或简单启动:
pm2 start server.js --name my-app
# 查看状态
pm2 list
# 保存当前配置(重启后自动恢复)
pm2 save
# 开机自启(生成 systemd 服务)
pm2 startup
# 按提示运行生成的命令(如:sudo env PATH=$PATH:/home/user/.nvm/versions/node/v20.x/bin pm2 startup systemd ...)
📌 ecosystem.config.js 示例:
module.exports = {
apps: [{
name: 'my-app',
script: './server.js',
instances: 2, // 多实例负载均衡
exec_mode: 'cluster',// 集群模式
env: {
NODE_ENV: 'production',
PORT: 3000
},
env_production: {
NODE_ENV: 'production'
}
}]
};
✅ 五、配置 Nginx 反向X_X(必备)
sudo nano /etc/nginx/sites-available/my-app
配置示例:
server {
listen 80;
server_name your-domain.com www.your-domain.com;
location / {
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;
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;
}
# 静态资源缓存优化(如有 frontend/dist)
location /static/ {
alias /var/www/my-app/frontend/dist/static/;
expires 1y;
add_header Cache-Control "public, immutable";
}
}
启用站点:
sudo ln -s /etc/nginx/sites-available/my-app /etc/nginx/sites-enabled/
sudo nginx -t # 测试配置
sudo systemctl reload nginx
🔐 HTTPS 配置(强烈推荐)
sudo certbot --nginx -d your-domain.com -d www.your-domain.com # 自动完成证书申请 + Nginx 配置 + 自动续期
✅ 六、环境变量与安全加固
-
避免硬编码密码/API Key
使用.env文件 +dotenv包,但切勿提交到 Git,改为:# 在服务器上创建 .env echo "DB_HOST=localhost" >> ~/.my-app.env echo "SECRET_KEY=your-secret" >> ~/.my-app.env chmod 600 ~/.my-app.env或在 PM2 中指定:
// ecosystem.config.js env: { NODE_ENV: 'production', DB_HOST: process.env.DB_HOST || 'localhost' } -
限制访问 IP / 禁用 root SSH
# 修改 /etc/ssh/sshd_config PermitRootLogin no PasswordAuthentication no # 然后重启 SSH:sudo systemctl restart sshd
✅ 七、监控与日志
-
PM2 日志
pm2 logs my-app pm2 describe my-app -
Nginx 日志
tail -f /var/log/nginx/access.log tail -f /var/log/nginx/error.log -
进阶:接入 Prometheus + Grafana 或云厂商监控(如阿里云云监控)
✅ 八、CI/CD 自动化(可选但推荐)
- GitHub Actions / GitLab CI 示例流程:
- 代码推送 → 触发流水线
- 构建镜像(Docker)或直接部署到服务器(SSH + rsync)
- 自动执行
npm ci,pm2 reload,nginx -s reload - 健康检查 → 回滚机制
💡 提示:生产环境建议使用 Docker + Docker Compose 提升可移植性与隔离性。
🔄 故障排查清单
| 问题 | 可能原因 | 解决方向 |
|---|---|---|
| 无法访问网站 | Nginx 未监听 80 / 防火墙拦截 | systemctl status nginx, ufw status |
| 502 Bad Gateway | Node 进程挂了 | pm2 list, journalctl -u pm2-user |
| 内存溢出 | 单实例无限增长 | 开启 PM2 cluster + 内存限制 (max_memory_restart) |
| 热更新失效 | 未监听文件变化 | 开发用 nodemon,生产靠 PM2 reload |
需要我提供:
- 📦 完整的
Dockerfile+docker-compose.yml模板? - 🚀 GitHub Actions 部署 YAML 示例?
- ☁️ 针对某家云厂商(如阿里云 ECS)的专属操作指南?
欢迎告诉我你的具体场景,我可以进一步定制方案!
CLOUD云枢