การ 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-restart | restart แอปอัตโนมัติเมื่อ crash หรือหน่วยความจำเต็ม |
| Cluster Mode | ใช้ CPU หลาย core เพิ่ม throughput |
| Log Management | เก็บ stdout/stderr แยกไฟล์ ดูแบบ real-time ได้ |
| Startup Script | แอปทำงานอัตโนมัติหลัง VPS reboot |
| Zero-downtime Deploy | reload แอปใหม่โดยไม่ drop connection |
| Monitoring | ดู CPU/Memory usage ของแต่ละ process |
2. สิ่งที่ต้องมีก่อนเริ่ม
- VPS Ubuntu 20.04/22.04/24.04 (หรือ Debian)
- Node.js ≥ 16 LTS ติดตั้งแล้ว
- npm หรือ yarn
- user ที่ไม่ใช่ root (แนะนำ)
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
--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
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 restart | restart (downtime สั้น) |
pm2 reload | reload แบบ 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
คำถามที่พบบ่อย (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 ภาษาไทย