Node.js 部署教學:5 種方式讓你的 Node 專案上線【2025】

Node.js 部署教學:5 種方式讓你的 Node 專案上線

你的 Node.js 專案在本機跑得很順,但一到「要怎麼上線」這個問題就卡住了嗎?別擔心,這篇教學將介紹五種最常見的 Node.js 部署方式,從最簡單的一鍵部署到完全自主的 VPS 配置,幫你找到最適合的方案。

無論你是要部署一個 Side Project、公司內部工具,還是需要高可用性的生產系統,這裡都有對應的解決方案。讓我們一起來看看各種部署方式的優缺點,以及完整的實作步驟。

如果你想了解更完整的部署策略,可以先閱讀 程式部署完整指南


五種部署方式總覽

nodejs-deployment-options

插圖:Node.js 五種部署方式總覽圖

場景描述:
Technical illustration showing Node.js 五種部署方式總覽圖. Clean, professional diagram style.

視覺重點:
- Clear presentation of the concept
- Professional technical diagram style
- Easy to understand visual elements

必須出現的元素:
- Relevant technical components
- Clear labels and annotations
- Logical flow or structure

需要顯示的中文字:

風格:
Clean flat design, technical illustration, modern infographic style

顏色調性:
Professional blues and grays, with accent colors for emphasis

避免元素:
Cluttered design, realistic photos, complex 3D rendering

在深入各種方式之前,先來看看這五種方案的定位:

方式 定位 一句話描述
Vercel Serverless 前端框架首選,Next.js 最佳搭配
Railway PaaS Heroku 替代品,簡單又實惠
AWS EC2 IaaS 完全掌控,適合進階需求
Docker 容器化 環境一致性,可部署到任何平台
PM2 程序管理 VPS 上的 Node.js 最佳實踐

這五種方式並非互斥,實務上經常組合使用。例如:Docker + PM2、EC2 + Docker、Railway + Docker 等。


方式一:Vercel 部署(最快速)

Vercel 是前端框架的最佳部署平台,特別適合 Next.js、Express API Routes 等 Serverless 架構。

適用場景

  • Next.js、Nuxt.js 等 SSR/SSG 框架
  • 簡單的 API 端點(Serverless Functions)
  • 需要全球 CDN 加速的前端專案
  • 想要最快速上線的 Side Project

部署步驟

1. 準備專案結構

my-node-app/
├── api/
│   └── hello.js      # API Route
├── public/
├── package.json
└── vercel.json       # 可選配置檔

2. 建立 API Route

// api/hello.js
export default function handler(req, res) {
  res.status(200).json({ message: 'Hello from Vercel!' });
}

3. 連接 GitHub 部署

# 安裝 Vercel CLI
npm i -g vercel

# 登入並部署
vercel login
vercel

# 或直接在 vercel.com 連接 GitHub 倉庫

4. 設定環境變數

在 Vercel Dashboard → Project Settings → Environment Variables 新增:

DATABASE_URL=postgres://...
API_KEY=your-secret-key

Vercel 的限制

限制項目 免費版 Pro 版
Serverless 執行時間 10 秒 60 秒
每月呼叫次數 100,000 1,000,000
頻寬 100 GB 1 TB

注意:傳統的 Express.js 長駐程序不適合部署到 Vercel,會遇到執行時間限制。如果你的專案是傳統 Express API,建議選擇 Railway 或 PM2。

想了解更多 Vercel 部署細節,請參考 Vercel 部署教學

💡 不確定該選哪種部署方式?

每種方式都有其適用場景,選錯可能浪費時間和金錢。

預約免費諮詢,讓我們根據你的專案需求推薦最佳方案。


方式二:Railway 部署(最平衡)

deployment-comparison-chart

插圖:部署方式比較表

場景描述:
Technical illustration showing 部署方式比較表. Clean, professional diagram style.

視覺重點:
- Clear presentation of the concept
- Professional technical diagram style
- Easy to understand visual elements

必須出現的元素:
- Relevant technical components
- Clear labels and annotations
- Logical flow or structure

需要顯示的中文字:

風格:
Clean flat design, technical illustration, modern infographic style

顏色調性:
Professional blues and grays, with accent colors for emphasis

避免元素:
Cluttered design, realistic photos, complex 3D rendering

Railway 是 Heroku 的最佳替代品,提供簡單的部署體驗、合理的價格,以及足夠的彈性。

適用場景

  • Express.js、Fastify 等傳統 Node.js 框架
  • 需要資料庫的完整後端應用
  • 想要簡單部署但不犧牲彈性
  • 預算有限的小團隊或個人專案

部署步驟

1. 準備 Express.js 專案

// server.js
const express = require('express');
const app = express();

const PORT = process.env.PORT || 3000;

app.get('/', (req, res) => {
  res.json({ message: 'Hello from Railway!' });
});

app.get('/health', (req, res) => {
  res.status(200).send('OK');
});

app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});

2. 確認 package.json

{
  "name": "my-express-app",
  "version": "1.0.0",
  "main": "server.js",
  "scripts": {
    "start": "node server.js",
    "dev": "nodemon server.js"
  },
  "engines": {
    "node": "20.x"
  },
  "dependencies": {
    "express": "^4.18.2"
  }
}

3. 連接 GitHub 部署

  1. 前往 railway.app
  2. 點擊「Start a New Project」
  3. 選擇「Deploy from GitHub repo」
  4. 授權並選擇你的 Repository
  5. Railway 會自動偵測 Node.js 並開始部署

4. 新增 PostgreSQL 資料庫(可選)

# 在 Railway Dashboard 點擊「+ New」→「Database」→「PostgreSQL」
# Railway 會自動注入 DATABASE_URL 環境變數

使用資料庫:

// 使用 Prisma 或其他 ORM
const { PrismaClient } = require('@prisma/client');
const prisma = new PrismaClient();

// DATABASE_URL 由 Railway 自動提供

Railway 費用

方案 費用 包含資源
Hobby $5/月(送 $5 Credit) 512MB RAM、共享 CPU
Pro $20/月起 更多資源、團隊功能

實際上小型專案每月約 $2-5,非常划算。

想了解更多 Railway 部署細節,請參考 Railway 部署教學


方式三:AWS EC2 部署(最彈性)

vercel-deploy-flow

插圖:Vercel 部署流程圖

場景描述:
Technical illustration showing Vercel 部署流程圖. Clean, professional diagram style.

視覺重點:
- Clear presentation of the concept
- Professional technical diagram style
- Easy to understand visual elements

必須出現的元素:
- Relevant technical components
- Clear labels and annotations
- Logical flow or structure

需要顯示的中文字:

風格:
Clean flat design, technical illustration, modern infographic style

顏色調性:
Professional blues and grays, with accent colors for emphasis

避免元素:
Cluttered design, realistic photos, complex 3D rendering

AWS EC2 提供完整的虛擬機控制權,適合需要進階配置或特殊需求的專案。

適用場景

  • 需要完全掌控伺服器環境
  • 有特殊系統需求(如 GPU、大記憶體)
  • 企業級應用,需要 VPC、安全群組等進階網路設定
  • 團隊有 DevOps 能力維護伺服器

部署步驟

1. 建立 EC2 Instance

# 建議配置
# - AMI: Amazon Linux 2023 或 Ubuntu 22.04
# - Instance Type: t3.micro(免費方案)或 t3.small
# - Storage: 20GB gp3
# - Security Group: 開放 22 (SSH)、80 (HTTP)、443 (HTTPS)

2. SSH 連線並安裝 Node.js

# 連線到 EC2
ssh -i your-key.pem ec2-user@your-ec2-ip

# 安裝 Node.js (使用 nvm)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
source ~/.bashrc
nvm install 20
nvm use 20

# 確認安裝
node --version
npm --version

3. 部署應用程式

# 安裝 Git
sudo yum install git -y  # Amazon Linux
# 或 sudo apt install git -y  # Ubuntu

# Clone 專案
git clone https://github.com/your-repo/your-app.git
cd your-app

# 安裝相依套件
npm ci --only=production

# 啟動應用(先用這個測試)
node server.js

4. 設定 PM2(生產環境必備)

# 安裝 PM2
npm install -g pm2

# 啟動應用
pm2 start server.js --name my-app

# 設定開機自動啟動
pm2 startup
pm2 save

# 查看狀態
pm2 status
pm2 logs my-app

5. 設定 Nginx 反向代理

# 安裝 Nginx
sudo yum install nginx -y  # Amazon Linux
# 或 sudo apt install nginx -y  # Ubuntu

# 編輯配置
sudo nano /etc/nginx/conf.d/my-app.conf
server {
    listen 80;
    server_name 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_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_cache_bypass $http_upgrade;
    }
}
# 測試並重載 Nginx
sudo nginx -t
sudo systemctl reload nginx

💡 EC2 設定太複雜?

VPS 設定涉及安全性、效能調校、監控等多個層面,需要專業知識。

預約免費諮詢,讓專家幫你處理伺服器配置。


方式四:Docker 容器化部署

docker-nodejs-layers

插圖:Node.js Docker Image 分層結構圖

場景描述:
Technical illustration showing Node.js Docker Image 分層結構圖. Clean, professional diagram style.

視覺重點:
- Clear presentation of the concept
- Professional technical diagram style
- Easy to understand visual elements

必須出現的元素:
- Relevant technical components
- Clear labels and annotations
- Logical flow or structure

需要顯示的中文字:

風格:
Clean flat design, technical illustration, modern infographic style

顏色調性:
Professional blues and grays, with accent colors for emphasis

避免元素:
Cluttered design, realistic photos, complex 3D rendering

Docker 將應用程式及其環境打包成容器,實現「一次打包,到處運行」。

適用場景

  • 需要開發、測試、生產環境一致
  • 團隊協作,避免「在我電腦上可以跑」的問題
  • 準備上 Kubernetes 或 Cloud Run
  • 想要可重複、可版本化的部署流程

部署步驟

1. 撰寫 Dockerfile

# 使用 Node.js Alpine 精簡版本
FROM node:20-alpine AS base

# 建置階段
FROM base AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build  # 如果有 build 步驟

# 生產階段
FROM base AS production
WORKDIR /app

# 安全性:使用非 root 用戶
RUN addgroup -S appgroup && adduser -S appuser -G appgroup

# 只複製生產環境需要的檔案
COPY --from=builder /app/package*.json ./
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
# 或 COPY --from=builder /app/server.js ./

# 設定環境變數
ENV NODE_ENV=production
ENV PORT=3000

# 切換到非 root 用戶
USER appuser

# 開放 port
EXPOSE 3000

# 健康檢查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1

# 啟動命令
CMD ["node", "dist/server.js"]

2. 建立 .dockerignore

node_modules
npm-debug.log
.git
.gitignore
.env
Dockerfile
docker-compose.yml
README.md
.dockerignore

3. 建置並執行

# 建置 Image
docker build -t my-node-app:1.0.0 .

# 本地測試
docker run -d -p 3000:3000 \
  -e DATABASE_URL=postgres://... \
  --name my-app \
  my-node-app:1.0.0

# 查看日誌
docker logs -f my-app

4. 推送到 Registry

# Docker Hub
docker tag my-node-app:1.0.0 username/my-node-app:1.0.0
docker push username/my-node-app:1.0.0

# 或 Google Container Registry
docker tag my-node-app:1.0.0 gcr.io/project-id/my-node-app:1.0.0
docker push gcr.io/project-id/my-node-app:1.0.0

5. 部署到 Cloud Run

gcloud run deploy my-app \
  --image gcr.io/project-id/my-node-app:1.0.0 \
  --platform managed \
  --region asia-east1 \
  --allow-unauthenticated

想了解更多 Docker 部署細節,請參考 Docker Deploy 教學


方式五:PM2 程序管理

pm2-architecture

插圖:PM2 程序管理架構圖

場景描述:
Technical illustration showing PM2 程序管理架構圖. Clean, professional diagram style.

視覺重點:
- Clear presentation of the concept
- Professional technical diagram style
- Easy to understand visual elements

必須出現的元素:
- Relevant technical components
- Clear labels and annotations
- Logical flow or structure

需要顯示的中文字:

風格:
Clean flat design, technical illustration, modern infographic style

顏色調性:
Professional blues and grays, with accent colors for emphasis

避免元素:
Cluttered design, realistic photos, complex 3D rendering

PM2 是 Node.js 生產環境的標準程序管理工具,提供自動重啟、負載平衡、日誌管理等功能。

適用場景

  • 在 VPS 或 EC2 上運行 Node.js
  • 需要多核心利用(Cluster Mode)
  • 需要零停機更新(Zero Downtime Reload)
  • 需要程序監控與自動重啟

PM2 核心功能

功能 說明
自動重啟 程序 crash 時自動重啟
Cluster Mode 利用多核心,自動負載平衡
零停機更新 更新程式碼時不中斷服務
日誌管理 統一管理 stdout/stderr
監控面板 即時查看 CPU、Memory 使用量

使用步驟

1. 安裝 PM2

npm install -g pm2

2. 基本使用

# 啟動應用
pm2 start server.js --name my-app

# Cluster Mode(利用所有 CPU 核心)
pm2 start server.js --name my-app -i max

# 指定核心數
pm2 start server.js --name my-app -i 4

# 查看狀態
pm2 status

# 查看日誌
pm2 logs my-app

# 監控
pm2 monit

3. 使用設定檔(推薦)

建立 ecosystem.config.js

module.exports = {
  apps: [{
    name: 'my-app',
    script: './server.js',
    instances: 'max',           // 使用所有 CPU 核心
    exec_mode: 'cluster',       // Cluster 模式
    autorestart: true,          // 自動重啟
    watch: false,               // 生產環境關閉 watch
    max_memory_restart: '1G',   // 記憶體超過 1G 自動重啟
    env: {
      NODE_ENV: 'development',
      PORT: 3000
    },
    env_production: {
      NODE_ENV: 'production',
      PORT: 3000
    },
    // 日誌設定
    log_date_format: 'YYYY-MM-DD HH:mm:ss',
    error_file: './logs/error.log',
    out_file: './logs/out.log',
    merge_logs: true,
    // 進階設定
    listen_timeout: 8000,
    kill_timeout: 5000
  }]
};

4. 使用設定檔啟動

# 開發環境
pm2 start ecosystem.config.js

# 生產環境
pm2 start ecosystem.config.js --env production

# 零停機更新
pm2 reload my-app

# 停止
pm2 stop my-app

# 刪除
pm2 delete my-app

5. 設定開機自動啟動

# 產生啟動腳本
pm2 startup

# 根據提示執行顯示的命令(需要 sudo)
sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u ec2-user --hp /home/ec2-user

# 儲存當前程序列表
pm2 save

6. PM2 + Docker 組合

即使使用 Docker,也可以在容器內使用 PM2:

FROM node:20-alpine

WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
RUN npm install -g pm2

COPY . .

EXPOSE 3000

CMD ["pm2-runtime", "ecosystem.config.js", "--env", "production"]

使用 pm2-runtime 而非 pm2 start,因為 Docker 需要前台程序。


五種方式完整比較

項目 Vercel Railway AWS EC2 Docker PM2
難度 ⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐
費用 免費起 $5/月起 $5/月起 依平台 免費
擴展性 自動 手動/自動 手動 依平台 手動
適合對象 前端/Serverless 一般專案 進階需求 DevOps VPS 用戶
長駐程序
WebSocket 有限制
自訂域名 需設定 依平台 需設定

如何選擇?

根據你的專案需求:

  • 快速上線 Side Project → Vercel 或 Railway
  • 標準 Express API → Railway
  • 需要完全掌控 → EC2 + PM2
  • 團隊協作、CI/CD → Docker + Cloud Run/K8s
  • 現有 VPS → PM2

FAQ 常見問題

Q1: Node.js 部署後記憶體一直增加怎麼辦?

這可能是記憶體洩漏(Memory Leak)。解決方案:
1. 使用 PM2 設定 max_memory_restart 自動重啟
2. 使用 --inspect 搭配 Chrome DevTools 分析
3. 檢查是否有未關閉的資料庫連線、未清理的 setInterval

Q2: PORT 環境變數是什麼意思?

雲端平台會透過 PORT 環境變數告訴你的應用該監聽哪個 port:

const PORT = process.env.PORT || 3000;

務必使用這個變數,而非寫死 port 號。

Q3: 部署後 Cannot find module 錯誤?

常見原因:
1. devDependencies 沒有安裝(生產環境用 npm ci --only=production
2. 本地是 Windows,伺服器是 Linux,路徑大小寫不一致
3. .gitignore 排除了必要的檔案

Q4: 如何實現零停機更新?

  • PM2:使用 pm2 reload(不是 restart)
  • Docker:使用 Rolling Update 策略
  • Railway/Vercel:平台自動處理

Q5: WebSocket 應用該選哪種方式?

Vercel 的 Serverless 不支援持久連線,建議選擇:
- Railway(支援 WebSocket)
- EC2 + PM2
- Docker + Cloud Run(需設定)


Node.js 部署方式選擇建議與重點整理

這篇教學介紹了五種 Node.js 部署方式:

  • Vercel:最快速,適合 Serverless 架構
  • Railway:最平衡,適合一般專案
  • AWS EC2:最彈性,適合進階需求
  • Docker:最可攜,適合團隊協作
  • PM2:最實用,VPS 必備工具

沒有「最好」的部署方式,只有「最適合」的方案。根據專案規模、團隊能力、預算限制來選擇,才能讓部署不再是痛點。

如果你想了解更多 Express.js 特化的部署技巧,可以接著閱讀 Express.js Deploy 教學


🚀 Node.js 部署遇到問題?

從選擇平台到效能調校,Node.js 部署有許多細節需要注意。

預約免費諮詢,讓 VibeFix 的工程師幫你解決部署難題,讓你的專案順利上線!

分享文章:
V

VibeFix

專門解決 AI Vibe Coding 後的疑難雜症,讓你的專案順利上線。

這篇文章有幫到你嗎?

如果還有問題,讓我們直接幫你解決!

聯繫我們