Skip to content
TaDev Logo TaDev
Go back

PM2 - Giữ cho Node.js app của bạn chạy mãi không ngừng nghỉ

Bạn có bao giờ deploy Node.js app lên server rồi… đi ngủ, sáng dậy thấy app die không? Hoặc server restart mà app không tự động chạy lại? Nếu có, thì PM2 chính là thứ bạn cần!

PM2 là một process manager cực kỳ phổ biến cho Node.js, giúp bạn chạy app như một service thực thụ - tự động restart khi crash, tự động chạy lại sau khi server reboot, và còn nhiều tính năng hay ho khác nữa.

Hôm nay mình sẽ hướng dẫn các bạn sử dụng PM2 từ cơ bản đến nâng cao. Đi thôi!

PM2 Process Manager Ảnh minh họa: Quản lý processes như một pro với PM2

Table of contents

Open Table of contents

PM2 là gì và tại sao bạn cần nó?

PM2 (Process Manager 2) là một production process manager cho Node.js applications. Nói đơn giản, nó giúp bạn:

Nghe có vẻ ngon phải không? Bắt đầu thôi!

Bước 1: Cài đặt PM2

Cài PM2 global bằng npm (hoặc yarn nếu bạn thích):

npm install -g pm2

Hoặc với yarn:

yarn global add pm2

Kiểm tra xem đã cài thành công chưa:

pm2 --version

Nếu thấy version hiện ra là OK rồi! 🎉

Terminal Setup Cài đặt PM2 chỉ với một dòng lệnh đơn giản

Bước 2: Chạy app với PM2

Cách 1: Chạy trực tiếp file Node.js

Nếu bạn có file app.js hoặc index.js:

pm2 start app.js --name "my-app"

Nếu bạn thường chạy app bằng npm start:

pm2 start npm --name "my-app" -- start

Giải thích một chút:

Cách 3: Chạy với ecosystem file (Pro level)

Tạo file ecosystem.config.js:

module.exports = {
  apps: [{
    name: 'my-app',
    script: 'npm',
    args: 'start',
    instances: 2, // Chạy 2 instances
    exec_mode: 'cluster', // Cluster mode để load balancing
    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 Z',
    merge_logs: true,
    autorestart: true,
    watch: false, // Không watch files trong production
    max_memory_restart: '1G' // Restart nếu dùng quá 1GB RAM
  }]
};

Sau đó chạy:

pm2 start ecosystem.config.js

Cách này pro hơn vì bạn có thể config mọi thứ trong file, dễ quản lý và version control!

Bước 3: Tự động khởi động sau khi reboot

Đây là phần quan trọng! Nếu không làm bước này, khi server restart thì app của bạn sẽ không tự động chạy lại.

3.1 Tạo startup script

pm2 startup

PM2 sẽ in ra một dòng lệnh, copy và chạy nó. Ví dụ:

sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u your-username --hp /home/your-username

3.2 Save danh sách processes

Sau khi đã start tất cả apps, chạy:

pm2 save

Lệnh này sẽ lưu lại danh sách các processes đang chạy. Khi server restart, PM2 sẽ tự động chạy lại các processes này.

Lưu ý: Mỗi khi bạn thêm/xóa app, nhớ chạy pm2 save lại nhé!

Server Monitoring Monitoring app của bạn 24/7 với PM2

Bước 4: Quản lý app

Xem danh sách apps đang chạy

pm2 list
# hoặc
pm2 ls

Bạn sẽ thấy bảng đẹp đẽ với thông tin về tất cả apps:

Xem thông tin chi tiết

pm2 show my-app

Lệnh này hiển thị mọi thông tin về app: path, arguments, environment variables, logs location, v.v.

Restart app

pm2 restart my-app

Hoặc restart tất cả:

pm2 restart all

Stop app

pm2 stop my-app

Delete app khỏi PM2

pm2 delete my-app

Reload app (zero-downtime)

pm2 reload my-app

reload khác với restart ở chỗ nó sẽ reload từng instance một, đảm bảo luôn có ít nhất một instance đang chạy. Rất hữu ích cho production!

Bước 5: Xem logs

Xem logs real-time

pm2 logs

Xem logs của một app cụ thể:

pm2 logs my-app

Xem chỉ error logs:

pm2 logs my-app --err

Xóa logs cũ

pm2 flush

Lệnh này xóa tất cả logs. Hữu ích khi logs quá nhiều làm đầy ổ cứng.

Logs Monitoring Theo dõi logs real-time để debug nhanh chóng

Bước 6: Monitoring

Monitoring trong terminal

pm2 monit

Lệnh này mở một dashboard real-time trong terminal, hiển thị:

Rất tiện để theo dõi app!

Web-based monitoring (PM2 Plus)

PM2 có service monitoring trên web (trước đây gọi là Keymetrics):

pm2 link [secret-key] [public-key]

Bạn có thể đăng ký miễn phí tại pm2.io để có dashboard đẹp mắt trên web.

Tips và tricks từ kinh nghiệm thực tế

1. Sử dụng cluster mode để tận dụng multi-core

pm2 start app.js -i max

-i max sẽ tạo số instances bằng số CPU cores. Ví dụ server có 4 cores thì sẽ chạy 4 instances.

2. Giới hạn memory để tránh memory leak

pm2 start app.js --max-memory-restart 500M

App sẽ tự động restart nếu dùng quá 500MB RAM. Rất hữu ích để handle memory leaks!

3. Watch mode cho development

pm2 start app.js --watch

PM2 sẽ tự động restart app khi có file thay đổi. Tiện cho development, nhưng đừng dùng trong production nhé!

4. Cron restart

Restart app vào thời điểm cố định:

pm2 start app.js --cron-restart="0 0 * * *"

Lệnh này restart app lúc 00:00 mỗi ngày. Hữu ích nếu app có memory leak nhẹ.

5. Update PM2

pm2 update

Chạy lệnh này sau khi update PM2 để đảm bảo daemon được update.

Troubleshooting - Những lỗi thường gặp

App không tự động start sau reboot

App bị restart liên tục

PM2 dùng quá nhiều memory

Success Deployment Deploy thành công! App chạy ổn định 24/7

Kết luận

PM2 là một công cụ không thể thiếu khi bạn deploy Node.js app lên production. Nó giúp app của bạn chạy ổn định, tự động recover khi có lỗi, và dễ dàng quản lý.

Tóm tắt các lệnh quan trọng:

# Cài đặt
npm install -g pm2

# Chạy app
pm2 start npm --name "my-app" -- start

# Setup auto-start
pm2 startup
pm2 save

# Quản lý
pm2 list
pm2 restart my-app
pm2 logs my-app
pm2 monit

# Update PM2
pm2 update

Một vài best practices cuối cùng:

  1. Luôn dùng ecosystem file cho production - dễ quản lý và version control
  2. Setup monitoring - Dùng PM2 Plus hoặc tích hợp với monitoring tools khác
  3. Giới hạn memory - Tránh app dùng hết RAM server
  4. Backup logs - Logs rất quan trọng cho debugging
  5. Test trước khi deploy - Test kỹ trên staging trước khi lên production

Chúc bạn deploy thành công! Nếu có thắc mắc gì về PM2, cứ để lại comment nhé! 🚀


Bài viết được viết dựa trên kinh nghiệm thực tế deploy hàng chục Node.js apps lên production. Nếu thấy hữu ích, đừng quên chia sẻ cho team nhé!


Share this post on:

Previous Post
Hướng dẫn tích hợp RevenueCat cho Flutter - Kiếm tiền từ app không còn là chuyện khó
Next Post
Sử dụng Flutter Version Manager (FVM) - Quản lý nhiều phiên bản Flutter dễ dàng