จัดการ Node.js App บน VPS ด้วย PM2
PM2 (Process Manager 2) เป็น production-grade process manager สำหรับ Node.js ช่วยให้ app รันตลอดเวลา auto-restart เมื่อ crash, จัดการ cluster หลาย process ใช้ทุก CPU core, rotate log อัตโนมัติ และรัน startup ใน boot เป็นเครื่องมือที่ทุก Node.js server ต้องมี
ติดตั้ง PM2
# ติดตั้ง Node.js ก่อน (ถ้ายังไม่มี)
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
# ติดตั้ง PM2 globally
sudo npm install -g pm2
# ตรวจ version
pm2 --version
รัน Application ด้วย PM2
# รัน app เบื้องต้น
pm2 start app.js --name "my-app"
# รัน Next.js / กำหนด interpreter
pm2 start npm --name "nextjs-app" -- start
# รัน cluster mode (ใช้ CPU ทุก core)
pm2 start app.js -i max --name "my-app"
# ดู status
pm2 status
pm2 list
ecosystem.config.js (แนะนำสำหรับ production)
nano ecosystem.config.js
module.exports = {
apps: [{
name: 'my-app',
script: 'app.js',
instances: 'max', // ใช้ทุก CPU core
exec_mode: 'cluster',
env: {
NODE_ENV: 'development',
PORT: 3000
},
env_production: {
NODE_ENV: 'production',
PORT: 3000
},
log_date_format: 'YYYY-MM-DD HH:mm:ss',
error_file: '/var/log/pm2/my-app-error.log',
out_file: '/var/log/pm2/my-app-out.log',
max_memory_restart: '512M' // restart ถ้ากิน RAM เกิน
}]
}
# รัน production
pm2 start ecosystem.config.js --env production
Auto-start หลัง Reboot
# สร้าง startup script
pm2 startup
# PM2 จะแจ้งคำสั่งให้รัน เช่น:
# sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u ubuntu --hp /home/ubuntu
# บันทึก process list ปัจจุบัน
pm2 save
pm2 save ต้องสั่งทุกครั้งที่เพิ่ม/ลบ process เพื่อให้ PM2 จำ list ล่าสุดไว้ restore หลัง reboot
ตรวจสอบว่า PM2 ทำงานถูกต้อง
# ดูสถานะ process ทั้งหมด
pm2 status
# ดู real-time log
pm2 logs my-app --lines 50
# ดู metric CPU/RAM
pm2 monit
# ดู detail ของ process
pm2 show my-app
# ตรวจ startup saved
pm2 list # ต้องเห็น online status
pm2 monit แสดง real-time CPU, RAM และ log พร้อมกันในหน้าจอเดียว คล้าย htop แต่สำหรับ Node.js process โดยเฉพาะ
แก้ปัญหาที่พบบ่อย
PM2 process status เป็น "errored" หรือ "stopped"
App crash ทันทีที่ start ตรวจ error log เพื่อหาสาเหตุ:
# ดู error log
pm2 logs my-app --err --lines 100
# รัน test ด้วย node โดยตรงก่อน
node app.js
# restart และ watch log
pm2 restart my-app && pm2 logs my-app
Port ชนกันหลาย process
ใน cluster mode ทุก worker ใช้ port เดียวกัน PM2 จัดการ round-robin ให้อัตโนมัติ แต่ต้องไม่ hardcode port คนละตัว:
# ใช้ process.env.PORT ใน app.js
const PORT = process.env.PORT || 3000
app.listen(PORT)
PM2 หายหลัง reboot ทั้งที่รัน pm2 startup แล้ว
ลืมรัน pm2 save หลัง startup หรือ PATH ของ node ในตอน startup script ผิด:
# ตรวจ systemd service
systemctl status pm2-ubuntu
# ถ้า service ไม่ active ให้รัน startup command ใหม่
pm2 unstartup
pm2 startup
# รันคำสั่งที่ PM2 แจ้ง
pm2 save
Log ขนาดใหญ่มากกินพื้นที่ disk
ต้องตั้ง log rotate ด้วย pm2-logrotate module:
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 50M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true
คำถามที่พบบ่อย
PM2 cluster mode กับ single mode ต่างกันอย่างไร?
Single mode รัน process เดียว ใช้ CPU core เดียว Cluster mode รัน N process (N = จำนวน CPU core) แต่ละ process เป็น Node.js instance อิสระ share TCP port กัน ทำให้ใช้ CPU หลาย core ได้ (Node.js ปกติ single-threaded) throughput สูงขึ้นหลายเท่า
ต่างจาก systemd service อย่างไร?
PM2 เหมาะกับ Node.js โดยเฉพาะ มี cluster, log rotation, monitoring, hot reload Systemd เป็น general purpose init system ที่ OS ใช้จัดการทุก service PM2 สร้าง systemd service ให้อีกทีในตอน pm2 startup สองอย่างนี้ทำงานร่วมกัน ไม่ใช่แทนกัน
จะ deploy app ใหม่โดยไม่ downtime ได้ไหม?
ได้ ด้วย pm2 reload my-app PM2 จะ reload process ทีละตัวแบบ rolling update ใน cluster mode ไม่มี downtime ต่างจาก pm2 restart ที่ stop ทุก process แล้วค่อย start ใหม่พร้อมกัน