Ubuntu上Node.js如何实现跨平台部署
导读:Ubuntu上Node.js跨平台部署实战指南 一、方案总览 容器化优先:使用 Docker 将应用及其依赖打包成镜像,在 Linux/Windows/macOS 目标环境一致运行,避免“本机能跑、服务器报错”。适合团队协作与多环境交付。...
Ubuntu上Node.js跨平台部署实战指南
一、方案总览
- 容器化优先:使用 Docker 将应用及其依赖打包成镜像,在 Linux/Windows/macOS 目标环境一致运行,避免“本机能跑、服务器报错”。适合团队协作与多环境交付。
- 原生部署:在 Ubuntu 服务器上用 NVM 安装与管理 Node.js LTS,配合 PM2 或 Systemd 做进程守护与开机自启,外网通过 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 -d或docker-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
- PM2:
- 反向代理与端口放行
- 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)的入方向安全组规则,避免外部无法访问。
- Nginx 示例:
四、跨平台与兼容性要点
- 版本策略
- 生产优先选择 Node.js LTS(如 20.x),兼顾稳定性与安全支持周期;避免使用已停止维护的版本。
- 原生模块与构建环境
- 若依赖 node-gyp 原生插件,需在目标平台准备编译链:
- Windows:安装 Python 3.x 与 Visual Studio 构建工具;
- macOS:安装 Xcode 命令行工具;
- Linux(Ubuntu):安装 python3、make、gcc/g++。
- 在
package.json中配置构建脚本(如"install": "node-gyp rebuild"),确保各平台npm install能自动编译。
- 若依赖 node-gyp 原生插件,需在目标平台准备编译链:
- 环境与配置
- 使用 .env 管理不同环境配置(如
NODE_ENV=production、数据库连接串),避免硬编码;用 PM2 或 Systemd 统一管理环境变量与日志路径。
- 使用 .env 管理不同环境配置(如
- 网络与端口
- 服务监听 0.0.0.0 而非 127.0.0.1;在云上需配置安全组放行对应端口;对外建议通过 Nginx/负载均衡 统一暴露 80/443 并启用 HTTPS。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Ubuntu上Node.js如何实现跨平台部署
本文地址: https://pptw.com/jishu/774916.html
