Deploy Node.js App บน VPS ด้วย PM2 Process Manager

การ Deploy Node.js App บน VPS ด้วยวิธีปกติอย่างการรัน node app.js ตรงๆ มีปัญหาใหญ่คือ ถ้าปิด terminal แอปก็หยุดทำงาน และถ้าแอป crash ก็ไม่ restart เอง PM2 (Process Manager 2) คือเครื่องมือที่แก้ปัญหาเหล่านี้ได้ครบในที่เดียว ทั้ง auto-restart, cluster mode, log management และ startup script

1. PM2 คืออะไร และทำไมต้องใช้

PM2 เป็น Production Process Manager สำหรับ Node.js ที่ได้รับความนิยมสูงสุด มีฟีเจอร์หลักดังนี้:

ฟีเจอร์คำอธิบาย
Auto-restartrestart แอปอัตโนมัติเมื่อ crash หรือหน่วยความจำเต็ม
Cluster Modeใช้ CPU หลาย core เพิ่ม throughput
Log Managementเก็บ stdout/stderr แยกไฟล์ ดูแบบ real-time ได้
Startup Scriptแอปทำงานอัตโนมัติหลัง VPS reboot
Zero-downtime Deployreload แอปใหม่โดยไม่ drop connection
Monitoringดู CPU/Memory usage ของแต่ละ process

2. สิ่งที่ต้องมีก่อนเริ่ม

แนะนำ: ใช้ nvm ในการติดตั้ง Node.js เพื่อจัดการหลาย version ได้ง่าย

3. ติดตั้ง Node.js ด้วย NVM

ถ้ายังไม่มี Node.js ให้ติดตั้งผ่าน nvm:

# ติดตั้ง nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc

# ติดตั้ง Node.js LTS
nvm install --lts
nvm use --lts

# ตรวจสอบ version
node -v
npm -v

4. ติดตั้ง PM2

ติดตั้ง PM2 แบบ global ด้วย npm:

npm install -g pm2

ตรวจสอบการติดตั้ง:

pm2 -v

5. Start แอปด้วย PM2

สมมติว่าแอปอยู่ที่ /var/www/myapp/app.js:

# Start แบบพื้นฐาน
pm2 start app.js

# ตั้งชื่อ process (แนะนำ)
pm2 start app.js --name "myapp"

# Start พร้อม argument
pm2 start app.js --name "myapp" -- --port 3000

# ดู status
pm2 status

# ดู log real-time
pm2 logs myapp
เคล็ดลับ: ตั้งชื่อ process ด้วย --name ทุกครั้ง เพื่อให้จัดการง่ายเมื่อมีหลาย app บน VPS เดียวกัน

6. ใช้ ecosystem.config.js จัดการ config

สำหรับ production แนะนำใช้ ecosystem file แทนการพิมพ์ argument ยาวๆ:

// ecosystem.config.js
module.exports = {
  apps: [{
    name: 'myapp',
    script: './app.js',
    instances: 'max',        // cluster mode — ใช้ทุก CPU core
    exec_mode: 'cluster',
    watch: false,
    max_memory_restart: '500M',
    env: {
      NODE_ENV: 'production',
      PORT: 3000
    },
    error_file: './logs/err.log',
    out_file: './logs/out.log',
    log_date_format: 'YYYY-MM-DD HH:mm:ss'
  }]
};
# start จาก config file
pm2 start ecosystem.config.js

# reload (zero-downtime)
pm2 reload ecosystem.config.js

7. Cluster Mode — เพิ่ม Performance

Node.js ทำงาน single-threaded ถ้าต้องการใช้ CPU หลาย core ต้องเปิด Cluster Mode:

# ใช้ทุก CPU core
pm2 start app.js -i max

# ใช้ 4 core
pm2 start app.js -i 4

# ดู process ทั้งหมด
pm2 list

# Reload แบบ zero-downtime
pm2 reload myapp
ข้อควรระวัง: Cluster Mode เหมาะกับ stateless app เท่านั้น ถ้าแอปเก็บ session ใน memory ต้องใช้ Redis สำหรับ session store แทน

8. ตั้งค่า Startup Script — แอปทำงานหลัง Reboot

นี่คือขั้นตอนสำคัญที่หลายคนมักลืม หากไม่ตั้ง PM2 จะหยุดทำงานทุกครั้งที่ VPS restart:

# สร้าง startup script (รันคำสั่งที่ได้จาก output ด้วย sudo)
pm2 startup

# ตัวอย่าง output จะมีคำสั่งให้ copy ไปรัน เช่น:
sudo env PATH=$PATH:/home/user/.nvm/versions/node/v20.0.0/bin \
  /home/user/.nvm/versions/node/v20.0.0/lib/node_modules/pm2/bin/pm2 \
  startup systemd -u user --hp /home/user

# หลัง start แอปแล้ว ให้ save state
pm2 save
สำคัญ: ต้อง pm2 save หลังทุกครั้งที่เพิ่ม/ลบ process เพื่อ save state ปัจจุบัน

9. Log Management

PM2 เก็บ log อัตโนมัติที่ ~/.pm2/logs/ และมีคำสั่งจัดการดังนี้:

# ดู log ทั้งหมด
pm2 logs

# ดู log เฉพาะ app
pm2 logs myapp

# ดู 100 บรรทัดล่าสุด
pm2 logs myapp --lines 100

# ล้าง log
pm2 flush

# ติดตั้ง log rotate อัตโนมัติ
pm2 install pm2-logrotate

10. Monitoring และ Commands พื้นฐาน

# Dashboard แบบ real-time
pm2 monit

# ดู process list
pm2 list

# ข้อมูลละเอียดของ app
pm2 show myapp

# Restart
pm2 restart myapp

# Stop
pm2 stop myapp

# Delete จาก PM2
pm2 delete myapp

# Restart ทั้งหมด
pm2 restart all
คำสั่งความหมาย
pm2 startเริ่ม process ใหม่
pm2 restartrestart (downtime สั้น)
pm2 reloadreload แบบ zero-downtime
pm2 stopหยุดชั่วคราว (ยังอยู่ใน list)
pm2 deleteลบออกจาก list
pm2 saveบันทึก state ปัจจุบัน

11. ตั้งค่า Nginx Reverse Proxy

ในการใช้งานจริง ควรใช้ Nginx เป็น reverse proxy ด้านหน้า Node.js:

# /etc/nginx/sites-available/myapp
server {
    listen 80;
    server_name yourdomain.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_cache_bypass $http_upgrade;
    }
}

# Enable config
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

12. Zero-Downtime Deployment

เมื่อต้อง update โค้ด ใช้ขั้นตอนนี้เพื่อไม่ให้ service ล่ม:

# Pull โค้ดใหม่
git pull origin main

# ติดตั้ง dependencies
npm install --production

# Reload แบบ zero-downtime (Cluster Mode)
pm2 reload myapp

# หรือ restart ถ้าไม่ได้ใช้ Cluster Mode
pm2 restart myapp
VPS AsiaGB: AsiaGB VPS ใช้ SSD รองรับ I/O สูง เหมาะสำหรับ Node.js + PM2 ที่ต้องการ response time ต่ำ มีให้เลือกทั้ง datacenter ไทย และสิงคโปร์ พร้อม Uptime 99%

คำถามที่พบบ่อย (FAQ)

PM2 คืออะไร ทำไมต้องใช้กับ Node.js

PM2 เป็น production process manager ที่ช่วยให้แอป Node.js ทำงาน 24/7 ด้วย auto-restart, cluster mode, log management โดยไม่ต้องเปิด terminal ค้างไว้

PM2 กับ nodemon ต่างกันอย่างไร

nodemon ใช้ใน development เพื่อ restart เมื่อไฟล์เปลี่ยน ส่วน PM2 ใช้ใน production เพื่อให้แอปทำงานต่อเนื่อง มี cluster mode เพิ่ม performance

Cluster Mode ของ PM2 คืออะไร

Cluster Mode ช่วยให้ PM2 สร้าง worker ตามจำนวน CPU core ทำให้รองรับ request ได้มากขึ้น เหมาะกับ server ที่มี CPU หลาย core

ถ้า VPS restart แล้ว PM2 จะยังทำงานอยู่ไหม

ถ้าตั้งค่า startup script ด้วย pm2 startup และ pm2 save แล้ว PM2 จะ start อัตโนมัติทุกครั้งที่ VPS reboot

PM2 Log อยู่ที่ไหน ดูได้อย่างไร

Log อยู่ที่ ~/.pm2/logs/ ดูแบบ real-time ด้วย pm2 logs และจัดการ log rotate ด้วย pm2 install pm2-logrotate

ใช้ VPS ของ AsiaGB Deploy Node.js ได้ไหม

ได้เลย AsiaGB VPS ใช้ Ubuntu + SSD รองรับการติดตั้ง Node.js, PM2, Nginx ได้ครบ มี Uptime 99% และ support ช่วยเหลือตลอด

สรุป

PM2 เป็นเครื่องมือจำเป็นสำหรับการ Deploy Node.js บน VPS ใน production โดยขั้นตอนหลักคือ: ติดตั้ง PM2 → start app ด้วย ecosystem config → เปิด Cluster Mode → ตั้ง startup script → ใช้ Nginx reverse proxy สำหรับผู้ที่ต้องการ VPS สำหรับรัน Node.js แนะนำ VPS AsiaGB ที่มี SSD, Uptime 99% และ support ภาษาไทย