- PM2 giải quyết vấn đề gì?
- PM2 vs systemd vs Docker — chọn cái nào?
- Các tính năng nổi bật của PM2
- 1. Auto restart — app chết là tự hồi sinh
- 2. Cluster mode — tận dụng 100% CPU
- 3. Zero-downtime reload — deploy không gián đoạn
- 4. Ecosystem config — quản lý nhiều app trong 1 file
- 5. Log management tích hợp
- 6. Auto-start on boot
- 7. Monitoring dashboard
- Cách cài đặt và sử dụng PM2
- Bước 1: Cài đặt
- Bước 2: Khởi động app
- Bước 3: Các lệnh thường dùng
- Bước 4: Cấu hình production với ecosystem file
- Bước 5: Bật auto-start khi reboot
- Những điều cần biết trước khi dùng PM2
- 1. Không dùng PM2 bên trong Docker container
- 2. Memory restart có delay 30 giây
- 3. Không dùng watch: true trong production
- 4. pm2 restart khác pm2 reload
- 5. Cập nhật biến môi trường cần --update-env
- 6. PM2 không phải orchestration tool
- 7. Giấy phép AGPL-3 cần lưu ý
- Khi nào nên dùng PM2?
- Khi nào KHÔNG nên dùng PM2?
- Kết luận
Nếu bạn từng chạy node app.js rồi đi ngủ, sáng ra thấy app đã chết vì một lỗi không bắt được — PM2 chính là câu trả lời.
PM2 giải quyết vấn đề gì?
Node.js chạy trên single-threaded event loop — nghĩa là một process Node.js chỉ sử dụng 1 CPU core. Nếu server của bạn có 8 core, 7 core còn lại bị bỏ phí. Thêm nữa, nếu process gặp lỗi không bắt được (uncaught exception), toàn bộ app sập. PM2 giải quyết cả hai vấn đề này:
- Process management: Tự động restart app khi crash, log output, giám sát health.
- Cluster mode: Chạy nhiều instance Node.js song song, mỗi instance 1 core, tự động load balance request giữa các instance.
- Zero-downtime reload: Deploy phiên bản mới mà không làm người dùng bị ngắt kết nối.
PM2 vs systemd vs Docker — chọn cái nào?
| Tiêu chí | PM2 | systemd | Docker |
|---|---|---|---|
| Mục đích chính | Quản lý process Node.js + load balancing | Quản lý service hệ thống (generic) | Containerization + deployment portable |
| Auto restart khi crash | Có — tích hợp sẵn | Có — qua Restart=always |
Có — qua restart: always |
| Load balancing đa nhân | Có — cluster mode built-in | Không — chỉ chạy 1 process | Không — cần orchestration bên ngoài |
| Zero-downtime deploy | Có — pm2 reload |
Không — restart = downtime | Có — rolling update qua orchestrator |
| Log management | Có — tích hợp, xoay vòng log | Không — cần cấu hình journald | Có — Docker logs |
| Monitoring dashboard | Có — pm2 monit + web dashboard |
Không — cần tool bên ngoài | Không — cần Prometheus/Grafana |
| Environment isolation | Không — chạy trực tiếp trên host | Không — chạy trực tiếp trên host | Có — container isolate hoàn toàn |
| Độ phức tạp | Thấp — cài bằng npm, chạy 1 lệnh | Trung bình — cần viết service file | Cao — cần Dockerfile, image, network |
| Phù hợp với | 1 VPS, small-medium app, nhanh gọn | Linux server, generic service | Microservices, cloud-native, scale lớn |
Quy tắc chọn nhanh:
- Chỉ có 1 VPS, muốn deploy nhanh trong 5 phút → PM2
- Đã dùng Docker/Kubernetes → không cần PM2, Docker daemon đã quản lý restart và scaling
- Chạy multi-service stack (Node + Python + Redis + DB) → Docker Compose hoặc systemd phù hợp hơn
Các tính năng nổi bật của PM2
1. Auto restart — app chết là tự hồi sinh
PM2 chạy như một daemon nền. Khi app crash vì bất kỳ lý do gì (uncaught exception, out of memory, segfault), PM2 tự động khởi động lại ngay lập tức. Bạn có thể giới hạn số lần restart liên tiếp để tránh loop vô hạn:
pm2 start app.js --max-restarts=10 --min-uptime=10s
2. Cluster mode — tận dụng 100% CPU
Chạy nhiều instance Node.js song song, mỗi instance 1 core:
pm2 start app.js -i max # dùng tất cả CPU core
pm2 start app.js -i 4 # chạy đúng 4 instance
PM2 tự động load balance request giữa các worker qua round-robin. Nếu 1 worker chết, request được chuyển sang worker khác mà không ảnh hưởng người dùng.
3. Zero-downtime reload — deploy không gián đoạn
Trong cluster mode, pm2 reload khởi động worker mới từng cái một, chờ worker mới sẵn sàng rồi mới tắt worker cũ. Người dùng không bị ngắt kết nối trong suốt quá trình deploy.
4. Ecosystem config — quản lý nhiều app trong 1 file
Thay vì gõ lệnh dài dòng, bạn định nghĩa toàn bộ stack trong ecosystem.config.js:
module.exports = {
apps: [
{
name: 'api',
script: './dist/main.js',
instances: 2,
exec_mode: 'cluster',
env: { NODE_ENV: 'production', PORT: 3001 },
max_memory_restart: '512M',
autorestart: true,
watch: false,
log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
},
{
name: 'web',
script: './node_modules/.bin/next',
args: 'start',
instances: 1,
env: { NODE_ENV: 'production', PORT: 3000 },
}
]
};
5. Log management tích hợp
PM2 tự động ghi log stdout và stderr ra file riêng cho từng process. Kết hợp với module pm2-logrotate để xoay vòng log, nén gzip, giữ log trong X ngày — tránh đầy ổ đĩa:
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 50M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true
6. Auto-start on boot
PM2 tự động tạo systemd service để khôi phục toàn bộ process list khi server reboot:
pm2 startup systemd # tạo startup script
pm2 save # lưu trạng thái hiện tại
7. Monitoring dashboard
pm2 monit mở terminal dashboard hiển thị CPU, memory, uptime của từng process trong thời gian thực. Ngoài ra còn có web dashboard qua PM2 Plus (trả phí) hoặc tích hợp Prometheus exporter.
Cách cài đặt và sử dụng PM2
Bước 1: Cài đặt
npm install -g pm2
Bước 2: Khởi động app
pm2 start app.js --name my-api
pm2 start app.js -i max --name api-cluster # cluster mode
Bước 3: Các lệnh thường dùng
pm2 list # xem tất cả process
pm2 status # trạng thái chi tiết
pm2 logs # xem log real-time
pm2 logs api --lines 200 # xem 200 dòng log cuối của app "api"
pm2 restart api # restart app
pm2 reload api # zero-downtime reload (cluster mode)
pm2 stop api # dừng app
pm2 delete api # xóa app khỏi PM2
pm2 monit # mở monitoring dashboard
Bước 4: Cấu hình production với ecosystem file
Tạo file ecosystem.config.cjs (dùng .cjs để tương thích với cả CommonJS và ES Module projects):
module.exports = {
apps: [{
name: 'my-app',
script: 'dist/main.js',
instances: 'max',
exec_mode: 'cluster',
env: {
NODE_ENV: 'production',
PORT: 3000
},
max_memory_restart: '500M',
node_args: '--max-old-space-size=512',
autorestart: true,
watch: false,
restart_delay: 3000,
max_restarts: 10,
min_uptime: '30s',
kill_timeout: 15000,
wait_ready: true,
listen_timeout: 30000,
log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
out_file: '/var/log/pm2/my-app.out.log',
error_file: '/var/log/pm2/my-app.err.log',
merge_logs: true
}]
};
Chạy bằng:
pm2 start ecosystem.config.cjs
Bước 5: Bật auto-start khi reboot
pm2 startup systemd
# Chạy lệnh PM2 output ra (thường là sudo env PATH=... pm2 startup systemd -u user --hp /home/user)
pm2 save
Những điều cần biết trước khi dùng PM2
1. Không dùng PM2 bên trong Docker container
Docker best practice là 1 process per container. Nếu bạn đã dùng Docker, Docker daemon đã đảm nhiệm restart policy (restart: always). Thêm PM2 vào container là thừa, tăng complexity, và vi phạm nguyên tắc containerization. Nếu dùng Docker, bỏ PM2 đi.
2. Memory restart có delay 30 giây
PM2 kiểm tra memory consumption theo chu kỳ 30 giây. Nếu app vượt max_memory_restart, có thể mất đến 30 giây PM2 mới kill và restart. Trong khoảng thời gian đó, app có thể đã crash hoặc làm chậm toàn bộ server. Giải pháp: Set max_memory_restart thấp hơn ngưỡng thực tế, hoặc dùng Docker với memory limit cứng hơn.
3. Không dùng watch: true trong production
Chế độ watch tự động restart khi file thay đổi. Trong production, điều này có thể gây restart loop vô hạn nếu build output ghi đè file liên tục. Luôn để watch: false trong production.
4. pm2 restart khác pm2 reload
restart kill tất cả instance đồng thời → có downtime ngắn. reload thay thế từng instance một → zero downtime. Trong production, luôn dùng pm2 reload.
5. Cập nhật biến môi trường cần --update-env
Khi bạn sửa .env file rồi chạy pm2 restart, PM2 không tự động đọc biến môi trường mới. Bạn phải dùng:
pm2 restart all --update-env
Quên flag này là app chạy với biến cũ, dẫn đến lỗi khó debug.
6. PM2 không phải orchestration tool
PM2 quản lý process trên 1 máy chủ duy nhất. Nếu bạn cần scale ra nhiều server, cân bằng tải giữa nhiều node, hoặc rolling deploy phức tạp — hãy dùng Docker Swarm, Kubernetes, hoặc cloud-native platform thay vì cố gắng ép PM2 làm việc ngoài khả năng.
7. Giấy phép AGPL-3 cần lưu ý
PM2 được phân phối dưới giấy phép GNU AGPL-3. Nếu bạn sửa đổi PM2 và phân phối qua network, bạn bắt buộc phải công bố source code dưới cùng giấy phép. Đa số dùng PM2 như tool (không modify) thì không ảnh hưởng, nhưng nếu bạn là công ty lớn hoặc embed PM2 vào sản phẩm — cần review legal.
Khi nào nên dùng PM2?
- Deploy Node.js app lên 1 VPS (DigitalOcean, Linode, AWS EC2) — nhanh, đơn giản, không cần Docker.
- Chạy nhiều micro-Node.js app trên cùng 1 server — mỗi app 1 process, quản lý bằng ecosystem file.
- Startup MVP — cần production-ready trong 10 phút, không có DevOps.
- Internal tools / Dashboards — app nội bộ, traffic thấp, cần uptime ổn định.
- Homelab / Self-hosted — chạy bot, cron job, API nhỏ trên NAS hoặc Raspberry Pi.
Khi nào KHÔNG nên dùng PM2?
- Đã dùng Docker / Kubernetes — orchestrator đã xử lý restart, scaling, health check.
- Multi-service stack phức tạp (Node + Python + Go + DB) — Docker Compose hoặc systemd phù hợp hơn.
- Cần scale ra nhiều server — PM2 chỉ quản lý 1 máy, không có service discovery.
- Team có DevOps chuyên trách — họ sẽ chọn Docker + K8s cho consistency và maintainability.
Kết luận
PM2 là một trong những công cụ đơn giản nhất để đưa Node.js app từ “chạy trên laptop” lên “production-ready”. Với auto restart, cluster mode, zero-downtime reload, và log management — tất cả trong một CLI tool cài bằng npm install -g pm2 — nó giúp developer solo hoặc team nhỏ deploy nhanh mà không cần học cả hệ sinh thái Docker/Kubernetes.
Tuy nhiên, PM2 không phải silver bullet. Nó là process manager cho 1 máy chủ, không phải orchestration platform. Khi hệ thống của bạn lớn lên, cần nhiều server, nhiều service, nhiều môi trường — đó là lúc Docker và Kubernetes trở nên cần thiết.
Nhưng cho đến lúc đó, PM2 vẫn là lựa chọn “đủ tốt” cho đa số ứng dụng Node.js production. Đơn giản, miễn phí, và nó chỉ hoạt động.
Bình luận