Cài Node.js & PM2 Trên VPS - Deploy Ứng Dụng 24/7, Auto Restart, Load Balancing
Bạn đã code xong 1 con bot Telegram, 1 API Express.js, hay 1 website Next.js — và giờ muốn nó chạy 24/7 trên VPS mà không cần mở máy tính? Hay bạn đang dùng node app.js rồi tắt terminal là app cũng tắt theo? Node.js + PM2 trên VPS TrumVPS 40K/tháng chính là giải pháp. Bài này hướng dẫn từ A-Z: cài Node.js, cài PM2, deploy app, auto restart, và cả load balancing cho app Node.js.
Tại Sao Cần PM2?
Chạy Node.js kiểu node app.js có 3 vấn đề chết người:
- Tắt terminal → app chết
- App crash 1 lần → không tự restart
- Không xem được log, không biết app đang sống hay chết
PM2 giải quyết tất cả: nó là process manager cho Node.js, giữ app của bạn sống mãi mãi, tự restart khi crash, xem log real-time, và còn hỗ trợ load balancing miễn phí.
Bước 1: Cài Node.js Trên VPS
SSH vào VPS TrumVPS của bạn. Có 2 cách cài Node.js:
Cách 1: NodeSource (khuyên dùng)
# Cài Node.js 22.x (LTS mới nhất 2026) curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash - sudo apt install -y nodejs # Kiểm tra node -v # v22.x.x npm -v # 10.x.x
Cách 2: NVM (nếu cần nhiều phiên bản)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash source ~/.bashrc nvm install 22 nvm use 22
Bước 2: Cài PM2 Toàn Cầu
sudo npm install -g pm2 # Kiểm tra pm2 -v
Để PM2 tự động chạy khi VPS reboot:
pm2 startup systemd # Chạy lệnh mà pm2 in ra (dạng sudo env PATH=...) pm2 save
Bước 3: Deploy Ứng Dụng Node.js Đầu Tiên
Giả sử bạn có 1 file server.js Express đơn giản:
// server.js
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;
app.get('/', (req, res) => {
res.json({ status: 'ok', uptime: process.uptime() });
});
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
Khởi động với PM2:
pm2 start server.js --name "my-api" pm2 status
Kết quả:
┌────┬──────────┬────────┬─────┬─────────┬────────┐ │ id │ name │ mode │ ↺ │ status │ cpu │ ├────┼──────────┼────────┼─────┼─────────┼────────┤ │ 0 │ my-api │ fork │ 0 │ online │ 0.1% │ └────┴──────────┴────────┴─────┴─────────┴────────┘
Giờ app của bạn đang chạy 24/7. Tắt terminal, tắt máy tính — app vẫn sống!
Bước 4: Các Lệnh PM2 Cần Nhớ
| Lệnh | Công Dụng |
|---|---|
pm2 status | Xem trạng thái tất cả app |
pm2 logs | Xem log real-time |
pm2 logs my-api | Xem log của 1 app |
pm2 restart my-api | Restart app |
pm2 stop my-api | Dừng app |
pm2 delete my-api | Xóa app khỏi PM2 |
pm2 monit | Dashboard CPU, RAM real-time |
pm2 save | Lưu danh sách app (để auto khởi động khi reboot) |
pm2 flush | Xóa hết log cũ |
pm2 logs là thấy mọi thứ app in ra, kể cả lỗi, real-time. Khỏi cần console.log rồi SSH vào xem!Bước 5: Cấu Hình Nâng Cao Với ecosystem.config.js
Khi có nhiều app, khai báo hết vào 1 file config cho dễ quản lý:
// ecosystem.config.js
module.exports = {
apps: [
{
name: 'api',
script: './server.js',
instances: 2, // Chạy 2 instance (load balancing)
exec_mode: 'cluster', // Dùng hết CPU core
env: {
NODE_ENV: 'production',
PORT: 3000
},
error_file: './logs/api-error.log',
out_file: './logs/api-out.log',
max_memory_restart: '300M', // Restart nếu RAM > 300MB
watch: false // Bật true nếu muốn auto-reload khi code thay đổi (dev)
},
{
name: 'bot-telegram',
script: './bot.js',
env: {
BOT_TOKEN: 'your-token-here'
}
}
]
};
Khởi động tất cả 1 lần:
pm2 start ecosystem.config.js pm2 save
Bước 6: Load Balancing Với PM2 Cluster Mode
PM2 có thể chạy nhiều instance của cùng 1 app để tận dụng hết CPU core của VPS:
# Chạy tối đa instance = số CPU core pm2 start server.js -i max --name "api-cluster" # Hoặc chỉ định số lượng pm2 start server.js -i 4 --name "api-cluster"
Kết quả: 1 VPS 2-core chạy 2 instance, xử lý gấp đôi request. PM2 tự động chia request giữa các instance (round-robin).
Bước 7: Cấu Hình Nginx Reverse Proxy
Để truy cập app qua domain thay vì http://IP:3000:
sudo nano /etc/nginx/sites-available/api.yourdomain.com
server {
listen 80;
server_name api.yourdomain.com;
location / {
proxy_pass http://127.0.0.1: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_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
sudo ln -s /etc/nginx/sites-available/api.yourdomain.com /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx
Bước 8: Giám Sát & Tối Ưu
Theo dõi hiệu năng:
pm2 monit # Dashboard CPU, RAM, request pm2 status # Trạng thái nhanh
Log management:
pm2 install pm2-logrotate # Tự động xoay log, giới hạn dung lượng pm2 set pm2-logrotate:max_size 10M pm2 set pm2-logrotate:retain 7
Update app không downtime:
git pull pm2 reload all # Reload từng instance một (zero-downtime!)
pm2 reload restart từng instance một — instance 1 restart xong mới đến instance 2. Trong lúc đó instance còn lại vẫn phục vụ request. Người dùng không hề biết bạn vừa update!So Sánh: Các Cách Chạy Node.js Trên VPS
| Cách | Auto Restart | Load Balancing | Log | Phù Hợp |
|---|---|---|---|---|
node app.js | ❌ | ❌ | ❌ | Dev local |
nohup node app.js & | ❌ | ❌ | ❌ | Tạm thời |
systemd service | ✅ | ❌ | ✅ | 1 app đơn giản |
| PM2 | ✅ | ✅ | ✅ | Production |
| Docker + PM2 | ✅ | ✅ | ✅ | Microservices |
Kết Luận
PM2 là công cụ không thể thiếu khi deploy Node.js lên production. Chỉ với vài dòng lệnh, bạn có ngay 1 hệ thống chạy 24/7, tự restart khi crash, load balancing, và zero-downtime deploy.
Với VPS TrumVPS từ 40K/tháng (1GB RAM), bạn thoải mái chạy 5-10 app Node.js + PM2 + Nginx + MySQL cùng lúc. Dư sức cho mọi dự án cá nhân và startup.
Cần VPS để deploy Node.js 24/7?
VPS TrumVPS từ 40K/tháng - 1GB RAM - Chạy PM2 cả chục app cùng lúc
Mã giảm giá: 42089QPI03TI (-9%)
🚀 THUÊ VPS NGAY