温馨提示×

CentOS Node.js项目部署流程

小樊
53
2025-11-28 03:42:18
栏目: 编程语言

CentOS 上部署 Node.js 项目的标准流程


一 准备与安装

  • 更新系统并安装基础工具
    • 执行:sudo yum update -y
    • 可选:sudo yum groupinstall -y "Development Tools"(便于编译原生依赖)
  • 安装 Node.js 与 npm(以 NodeSource 为例,选择与你项目匹配的版本)
    • 示例(Node.js 16.x):
      curl -sL https://rpm.nodesource.com/setup_16.x | sudo bash -
      sudo yum install -y nodejs
      
    • 验证:node -vnpm -v
  • 如需更高版本,可将 setup_16.x 替换为 setup_18.x/20.x 等对应脚本。

二 部署应用代码

  • 方式一:Git 克隆
    sudo mkdir -p /var/www/myapp
    cd /var/www/myapp
    git clone <你的仓库地址> .
    
  • 方式二:SCP/SFTP 上传
    scp -r /本地/项目/路径 用户@服务器IP:/var/www/myapp
    
  • 进入项目目录并安装依赖
    cd /var/www/myapp
    npm install        # 或 yarn install
    
  • 如项目包含构建步骤(如 TypeScript、Webpack),先执行构建:
    npm run build     # 以项目 package.json 脚本为准
    

三 进程管理与开机自启

  • 使用 PM2 管理进程(推荐)
    • 全局安装:sudo npm install -g pm2
    • 启动应用:pm2 start app.js --name <app-name>
    • 常用命令:pm2 statuspm2 logs <app-name>pm2 restart <app-name>pm2 stop <app-name>
    • 设置开机自启:pm2 startup 按提示执行,然后 pm2 save
  • 使用配置文件(ecosystem.config.js)更便于多环境与集群
    module.exports = {
      apps: [{
        name: 'my-app',
        script: 'app.js',
        instances: 'max',
        exec_mode: 'cluster',
        autorestart: true,
        watch: false,
        max_memory_restart: '1G',
        env: { NODE_ENV: 'development' },
        env_production: { NODE_ENV: 'production' }
      }]
    };
    
    • 启动:pm2 start ecosystem.config.js --env production
  • 不使用 PM2 时的替代方案:Systemd 服务
    • 新建:sudo nano /etc/systemd/system/myapp.service
    • 示例:
      [Unit]
      Description=My Node.js App
      After=network.target
      
      [Service]
      ExecStart=/usr/bin/node /var/www/myapp/app.js
      Restart=always
      User=nodeuser
      Group=nodeuser
      Environment=NODE_ENV=production
      WorkingDirectory=/var/www/myapp
      StandardOutput=journal
      StandardError=journal
      
      [Install]
      WantedBy=multi-user.target
      
    • 启用:sudo systemctl daemon-reload && sudo systemctl enable myapp && sudo systemctl start myapp

四 反向代理与防火墙

  • 安装并启动 Nginx
    sudo yum install -y nginx
    sudo systemctl start nginx
    sudo systemctl enable nginx
    
  • 配置反向代理(示例:Node 服务在 3000 端口)
    • 新建:sudo nano /etc/nginx/conf.d/myapp.conf
    • 内容:
      server {
        listen 80;
        server_name 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;
        }
      }
      
    • 生效:sudo systemctl reload nginx
  • 防火墙放行 HTTP/HTTPS
    sudo firewall-cmd --permanent --zone=public --add-service=http
    sudo firewall-cmd --permanent --zone=public --add-service=https
    sudo firewall-cmd --reload
    
  • 如需 HTTPS,建议使用 Let’s Encrypt 的 certbot 为 Nginx 自动签发证书。

五 环境变量与日志排查

  • 环境变量
    • 推荐在应用目录使用 .env 文件(由 dotenv 等库加载),或写入系统级脚本:
      sudo nano /etc/profile.d/node.sh
      # 内容示例:
      export NODE_ENV=production
      export DATABASE_URL=your_db_url
      # 生效:
      source /etc/profile.d/node.sh
      
  • 日志与监控
    • PM2:pm2 logs <app-name>pm2 monit
    • Systemd:sudo journalctl -u myapp -f
  • 常见问题速查
    • 端口未放行:检查 firewalld 与云厂商安全组是否允许 80/443/3000
    • 权限问题:确保运行用户对项目目录有读写权限,生产环境不建议以 root 运行 Node。
    • 依赖安装失败:确认 Node/npm 版本与项目要求一致,必要时使用 yarn 或设置国内镜像源加速。
    • 启动命令错误:核对 package.jsonscripts.start 与入口文件(如 app.js/index.js)路径。

0