Ubuntu上Node.js跨平台部署实战指南
一、方案总览
二、容器化部署步骤(推荐)
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"]
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。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 应用的要点。三、原生部署步骤(不使用容器)
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
npm i -g pm2
pm2 start server.js --name "myapp"
pm2 startup systemd
pm2 save
pm2 logs
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
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
四、跨平台与兼容性要点
package.json 中配置构建脚本(如 "install": "node-gyp rebuild"),确保各平台 npm install 能自动编译。NODE_ENV=production、数据库连接串),避免硬编码;用 PM2 或 Systemd 统一管理环境变量与日志路径。