Node.js项目部署到云服务器的完整流程有哪些?

将 Node.js 项目部署到云服务器(如阿里云、腾讯云、AWS EC2 等)的完整流程通常包含以下关键步骤。以下以 Linux 服务器(Ubuntu/Debian) 为例,采用主流生产级实践:


✅ 一、准备工作

  1. 购买并配置云服务器

    • 选择操作系统(推荐 Ubuntu 20.04+ 或 CentOS 7+)
    • 开放必要端口(默认 SSH: 22;应用端口如 3000;Nginx: 80/443)
    • 配置安全组/防火墙规则(仅开放所需端口)
  2. 安装基础依赖

    # 更新系统
    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 cinpm 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 示例流程:
    1. 代码推送 → 触发流水线
    2. 构建镜像(Docker)或直接部署到服务器(SSH + rsync)
    3. 自动执行 npm ci, pm2 reload, nginx -s reload
    4. 健康检查 → 回滚机制

💡 提示:生产环境建议使用 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云枢 » Node.js项目部署到云服务器的完整流程有哪些?