Cài Node.js & PM2 Trên VPS - Deploy Ứng Dụng 24/7, Auto Restart, Load Balancing

📅 05/2026 · ⏱ 10 phút đọc · 🏷 Hướng Dẫn

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:

  1. Tắt terminal → app chết
  2. App crash 1 lần → không tự restart
  3. 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
💡 Pro tip: Dùng NodeSource nếu chỉ cần 1 phiên bản. Dùng NVM nếu bạn có nhiều project cần các phiên bản Node khác nhau (vd: project cũ cần Node 16, project mới cần Node 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ệnhCông Dụng
pm2 statusXem trạng thái tất cả app
pm2 logsXem log real-time
pm2 logs my-apiXem log của 1 app
pm2 restart my-apiRestart app
pm2 stop my-apiDừng app
pm2 delete my-apiXóa app khỏi PM2
pm2 monitDashboard CPU, RAM real-time
pm2 saveLưu danh sách app (để auto khởi động khi reboot)
pm2 flushXóa hết log cũ
🔥 PM2 logs là tính năng xịn nhất — gõ 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).

⚠️ Lưu ý cluster mode: Nếu app của bạn dùng biến toàn cục (global state) hoặc WebSocket stateful, cần dùng Redis để đồng bộ giữa các instance. Với app stateless như REST API thông thường thì cứ thoải mái dùng cluster!

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!)
🚀 Zero-downtime deploy: 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áchAuto RestartLoad BalancingLogPhù Hợp
node app.jsDev local
nohup node app.js &Tạm thời
systemd service1 app đơn giản
PM2Production
Docker + PM2Microservices

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