温馨提示×

Ubuntu上Node.js如何实现跨平台部署

小樊
35
2025-12-18 03:16:22
栏目: 编程语言

Ubuntu上Node.js跨平台部署实战指南

一、方案总览

  • 容器化优先:使用 Docker 将应用及其依赖打包成镜像,在 Linux/Windows/macOS 目标环境一致运行,避免“本机能跑、服务器报错”。适合团队协作与多环境交付。
  • 原生部署:在 Ubuntu 服务器上用 NVM 安装与管理 Node.js LTS,配合 PM2Systemd 做进程守护与开机自启,外网通过 Nginx 反向代理与 HTTPS 暴露服务。

二、容器化部署步骤(推荐)

  • 基础镜像与多阶段构建
    • 选择官方镜像(如:node:20 或体积更小的 node:20-alpine),使用多阶段构建分离依赖安装与产物拷贝,减小镜像体积并提升安全性。
  • 示例 Dockerfile
    • 单阶段示例(便于快速上手):
      FROM node:20
      WORKDIR /usr/src/app
      COPY package*.json ./
      RUN npm ci --only=production
      COPY . .
      EXPOSE 3000
      ENV NODE_ENV=production
      CMD ["node","server.js"]
      
    • 多阶段示例(构建前端产物后再启动 Node 服务):
      FROM node:20 AS build
      WORKDIR /app
      COPY package*.json ./
      RUN npm ci
      COPY . .
      RUN npm run build --if-present
      
      FROM node:20-alpine
      WORKDIR /app
      COPY --from=build /app/dist ./dist
      COPY --from=build /app/node_modules ./node_modules
      COPY --from=build /app/package*.json ./
      EXPOSE 3000
      ENV NODE_ENV=production
      CMD ["node","dist/main.js"]
      
  • 构建与运行
    • 构建:docker build -t my-node-app .
    • 运行:docker run -d -p 4000:3000 --name app my-node-app
    • 说明:-p 4000:3000 将宿主机 4000 端口映射到容器 3000 端口;生产环境建议使用反向代理(如 Nginx)统一暴露 80/443
  • Docker Compose(多服务)
    • 示例:
      version: "3.8"
      services:
        web:
          build: .
          ports:
            - "3000:3000"
          environment:
            - NODE_ENV=production
          depends_on:
            - db
        db:
          image: mongo:6
          volumes:
            - db-data:/data/db
      volumes:
        db-data:
      
    • 启动:docker compose up -ddocker-compose up -d。以上流程覆盖在 Ubuntu 上用 Docker 构建、运行与编排 Node.js 应用的要点。

三、原生部署步骤(不使用容器)

  • 安装 Node.js(NVM)
    • 安装与镜像加速:
      curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
      # 重新加载 shell
      source ~/.bashrc
      # 使用国内镜像加速
      export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node
      # 安装与切换 LTS
      nvm install --lts
      nvm use --lts
      node -v && npm -v
      
  • 进程守护与自启
    • PM2:
      npm i -g pm2
      pm2 start server.js --name "myapp"
      pm2 startup systemd
      pm2 save
      pm2 logs
      
    • Systemd(备选):
      sudo tee /etc/systemd/system/nodeapp.service >/dev/null <<'EOF'
      [Unit]
      Description=Node.js App
      After=network.target
      
      [Service]
      Type=simple
      User=ubuntu
      WorkingDirectory=/opt/myapp
      ExecStart=/usr/bin/node /opt/myapp/server.js
      Restart=always
      Environment=NODE_ENV=production
      Environment=PORT=3000
      
      [Install]
      WantedBy=multi-user.target
      EOF
      sudo systemctl daemon-reload
      sudo systemctl enable --now nodeapp
      
  • 反向代理与端口放行
    • Nginx 示例:
      sudo apt install -y nginx
      sudo tee /etc/nginx/sites-available/myapp <<'EOF'
      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 Host $host;
          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;
        }
      }
      EOF
      sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled
      sudo nginx -t && sudo systemctl reload nginx
      
    • 云服务器需放行对应端口(如 80/443/3000)的入方向安全组规则,避免外部无法访问。

四、跨平台与兼容性要点

  • 版本策略
    • 生产优先选择 Node.js LTS(如 20.x),兼顾稳定性与安全支持周期;避免使用已停止维护的版本。
  • 原生模块与构建环境
    • 若依赖 node-gyp 原生插件,需在目标平台准备编译链:
      • Windows:安装 Python 3.xVisual Studio 构建工具
      • macOS:安装 Xcode 命令行工具
      • Linux(Ubuntu):安装 python3makegcc/g++
    • package.json 中配置构建脚本(如 "install": "node-gyp rebuild"),确保各平台 npm install 能自动编译。
  • 环境与配置
    • 使用 .env 管理不同环境配置(如 NODE_ENV=production、数据库连接串),避免硬编码;用 PM2 或 Systemd 统一管理环境变量与日志路径。
  • 网络与端口
    • 服务监听 0.0.0.0 而非 127.0.0.1;在云上需配置安全组放行对应端口;对外建议通过 Nginx/负载均衡 统一暴露 80/443 并启用 HTTPS

0