Node.js 部署教學:5 種方式讓你的 Node 專案上線
你的 Node.js 專案在本機跑得很順,但一到「要怎麼上線」這個問題就卡住了嗎?別擔心,這篇教學將介紹五種最常見的 Node.js 部署方式,從最簡單的一鍵部署到完全自主的 VPS 配置,幫你找到最適合的方案。
無論你是要部署一個 Side Project、公司內部工具,還是需要高可用性的生產系統,這裡都有對應的解決方案。讓我們一起來看看各種部署方式的優缺點,以及完整的實作步驟。
如果你想了解更完整的部署策略,可以先閱讀 程式部署完整指南。
五種部署方式總覽

插圖: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 部署(最平衡)

插圖:部署方式比較表
場景描述:
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 部署
- 前往 railway.app
- 點擊「Start a New Project」
- 選擇「Deploy from GitHub repo」
- 授權並選擇你的 Repository
- 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 部署流程圖
場景描述:
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 容器化部署

插圖: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 程序管理架構圖
場景描述:
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 的工程師幫你解決部署難題,讓你的專案順利上線!