PM2 là gì? Process Manager giữ Node.js app sống “mãi mãi” trong production

PM2 (Process Manager 2) là công cụ quản lý process cho Node.js phổ biến nhất hiện nay với hơn 600 triệu lượt tải và 42.000+ sao trên GitHub. Nó giải quyết một vấn đề đơn giản nhưng cực kỳ quan trọng trong production: làm sao để app Node.js chạy liên tục 24/7 — tự động restart khi crash, tận dụng đa nhân CPU, và không cần bạn ngồi canh terminal.

PM2 là gì? Process Manager giữ Node.js app sống “mãi mãi” trong production

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:

  1. Process management: Tự động restart app khi crash, log output, giám sát health.
  2. 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.
  3. 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


  • Không có bình luận.

Công cụ trực tuyến

Nhấn Ctrl + \ trên máy tính, hoặc vuốt sang trái ở bất kỳ đâu trên mobile.

Đăng nhập





Đang tải...