Khi nào nên dùng PM2 cho NestJS
Nếu bạn đang deploy NestJS theo kiểu đơn giản trên VPS hoặc một máy Linux riêng, rất dễ rơi vào flow này:
- SSH vào server
- chạy
npm run start:prod - đóng terminal là app chết
- app crash thì không tự lên lại
- reboot server xong phải vào chạy lại tay
PM2 sinh ra để giải quyết đúng bài toán đó. Nó là process manager cho Node.js, giúp app NestJS:
- chạy nền ổn định
- tự restart khi crash
- có log riêng
- tự start lại sau reboot
Với các project không cần Docker hoặc chưa muốn dựng systemd service thủ công, PM2 là lựa chọn rất thực dụng.
Khi PM2 phù hợp nhất
PM2 rất hợp nếu bạn:
- có một VPS nhỏ
- deploy app NestJS trực tiếp lên Ubuntu
- muốn chạy vài app Node.js trên cùng một máy
- cần log và restart tự động nhưng chưa muốn container hoá
Nếu hạ tầng của bạn đã đi hết sang Docker Compose, Kubernetes hoặc systemd chuẩn bài, PM2 có thể không còn là lựa chọn số 1. Nhưng với nhiều app nhỏ và vừa, nó vẫn rất hiệu quả.
Cài PM2
Trên server:
npm install -g pm2
Kiểm tra:
pm2 -v
Build NestJS trước khi chạy
Thông thường NestJS production sẽ chạy từ thư mục dist:
npm install
npm run build
Sau khi build xong, entrypoint thường là:
dist/main.js
Cách chạy nhanh nhất với PM2
Nếu chỉ muốn chạy ngay:
pm2 start dist/main.js --name my-nest-app
Lệnh này đủ để:
- tạo process nền
- quản lý process qua PM2
- restart lại khi app crash
Xem danh sách process:
pm2 list
Nên dùng ecosystem file để dễ quản lý
Khi chạy production thật, nên dùng file ecosystem.config.js thay vì nhớ lệnh dài.
Ví dụ:
module.exports = {
apps: [
{
name: "my-nest-app",
script: "dist/main.js",
cwd: "/var/www/my-nest-app",
instances: 1,
exec_mode: "fork",
autorestart: true,
watch: false,
max_memory_restart: "500M",
env: {
NODE_ENV: "production",
PORT: 3000,
},
},
],
};
Chạy bằng:
pm2 start ecosystem.config.js
Ưu điểm là bạn có thể commit file này cùng project và deploy lại rất dễ.
Những lệnh PM2 dùng nhiều nhất
pm2 list
pm2 logs my-nest-app
pm2 restart my-nest-app
pm2 stop my-nest-app
pm2 delete my-nest-app
pm2 monit
Ý nghĩa nhanh:
logs: xem log stdout/stderrrestart: restart app sau khi deploy code mớimonit: xem CPU và RAM theo thời gian thực
Tự chạy lại sau reboot
Đây là phần nhiều người quên nhất. Chỉ pm2 start thôi thì reboot xong app chưa chắc tự lên.
Flow đúng là:
pm2 startup
PM2 sẽ in ra một lệnh tiếp theo, thường có dạng sudo env PATH=... pm2 startup systemd .... Copy đúng lệnh đó và chạy.
Sau đó lưu danh sách process hiện tại:
pm2 save
Khi đó, sau mỗi lần server reboot, PM2 sẽ tự restore process và chạy lại app NestJS.
Flow deploy thực tế với PM2
Một flow đơn giản nhưng đủ dùng:
git pull
npm install
npm run build
pm2 restart my-nest-app
Nếu app chạy bằng ecosystem file:
pm2 restart ecosystem.config.js --only my-nest-app
Ý chính là build xong rồi mới restart để PM2 dùng bản dist mới nhất.
Log và debug khi app có vấn đề
Xem log realtime:
pm2 logs my-nest-app
Xem chi tiết process:
pm2 show my-nest-app
Lệnh show rất hữu ích vì nó cho bạn biết:
- đường dẫn script đang chạy
- số lần restart
- trạng thái hiện tại
- env vars cơ bản
Nếu app restart liên tục, kiểm tra ngay:
- lỗi trong
pm2 logs - port đã bị chiếm chưa
- biến môi trường có đủ chưa
- file
dist/main.jscó tồn tại không
Những chỗ dễ làm sai
1. Chạy npm run start:prod thay vì chạy file dist/main.js
PM2 quản lý process Node tốt nhất khi bạn chỉ rõ script thật sự cần chạy. Với NestJS, đa số trường hợp đó là dist/main.js.
2. Quên pm2 save
Nhiều người chạy pm2 startup nhưng quên pm2 save, đến lúc reboot thì process không tự restore.
3. Không build lại trước khi restart
Nếu code TypeScript đã đổi mà chưa npm run build, PM2 restart xong vẫn dùng bundle cũ.
4. Bật watch trên production
watch: true có thể tiện ở dev, nhưng thường không nên bật ở production vì dễ gây restart không cần thiết và tốn tài nguyên.
5. Không giới hạn memory
max_memory_restart là một cấu hình đáng dùng nếu app Node có nguy cơ leak RAM. Khi vượt ngưỡng, PM2 sẽ restart process để tránh server chết hẳn.
Khi nào nên dùng PM2 thay vì Docker
PM2 hợp hơn Docker khi:
- bạn chỉ có 1 app NestJS nhỏ
- muốn deploy nhanh trên VPS
- không muốn quản lý image, registry, compose
- cần process manager đơn giản cho Node.js
Docker hợp hơn khi:
- app phụ thuộc nhiều service đi kèm
- bạn cần môi trường portable
- team đã chuẩn hoá deployment bằng container
Kết luận
PM2 là cách rất thực tế để chạy NestJS trên production nếu bạn đang deploy trực tiếp lên Linux:
- start app nền
- tự restart khi crash
- xem log dễ
- tự chạy lại sau reboot
Nếu bạn chưa muốn container hoá toàn bộ hạ tầng mà vẫn cần app NestJS chạy ổn định trên VPS, PM2 là một điểm bắt đầu rất tốt.