Tóm tắt nhanh: Deploy Node.js trên VPS là quá trình chuyển mã nguồn ứng dụng từ máy tính cá nhân lên máy chủ ảo chạy Linux để web hoạt động public trên internet. Để chạy ổn định chuẩn production, quy trình cần 4 thành phần bắt buộc: Node.js cài qua NVM (quản lý môi trường), PM2 (giữ tiến trình chạy ngầm 24/7, tự restart khi crash), Nginx (Reverse Proxy định tuyến request từ port 80/443 về port nội bộ) và Certbot (cấp chứng chỉ HTTPS từ Let’s Encrypt miễn phí). Thiếu bất kỳ thành phần nào, ứng dụng sẽ không đạt tiêu chuẩn production.
- Cài Node.js an toàn qua NVM để dễ chuyển đổi version giữa các dự án.
- Dùng PM2 thay cho
node app.jstrực tiếp — ứng dụng sẽ không sập khi đóng SSH. - Cấu hình Nginx Reverse Proxy để người dùng truy cập qua domain thay vì port :3000.
- Mở đúng port UFW Firewall, tránh block Nginx sau khi cấu hình.
- Cài SSL Let’s Encrypt qua Certbot — chỉ 1 lệnh, tự động redirect HTTP sang HTTPS.
Code xong app Node.js, chạy node server.js trên VPS thấy web lên ngon. Nhưng vừa tắt cửa sổ terminal SSH — web lập tức trả về This site can’t be reached. Hoặc tệ hơn: app chạy được nhưng trình duyệt hiện biểu tượng khóa đỏ kèm cảnh báo Not Secure, khiến khách hàng ngần ngại nhấp vào. Đây là hai lỗi phổ biến nhất gặp phải khi lần đầu đưa web Node.js lên VPS — và cả hai đều có nguyên nhân rõ ràng, sửa được hoàn toàn.
Bài viết này hướng dẫn cách deploy Node.js trên VPS theo stack chuẩn production mà đội ngũ kỹ thuật thực tế sử dụng: NVM để quản lý môi trường Node.js, PM2 để ứng dụng sống dai không sập, Nginx làm Reverse Proxy mở đường cho domain, UFW để khóa firewall đúng cách, và Certbot để cấp SSL HTTPS miễn phí. Không phải hướng dẫn chạy thử — mà là quy trình sẵn sàng go-live thực sự. Bạn cần chuẩn bị sẵn một VPS Linux trước khi bắt đầu.
![Hướng Dẫn Deploy Node.js Trên VPS: PM2, Nginx & SSL Chi Tiết [2026] 1 Sơ đồ kiến trúc stack production](https://interdata.vn/blog/wp-content/uploads/2026/03/So-do-kien-truc-stack-production.webp)
Cần chuẩn bị gì trước khi đưa web Node.js lên VPS?
Trước khi gõ bất kỳ lệnh nào, hãy xác nhận đủ 4 thứ sau. Thiếu một trong số này, các bước phía dưới sẽ gặp lỗi giữa chừng và khó debug hơn.
- VPS chạy Ubuntu 22.04 hoặc 24.04 LTS — đây là hai phiên bản được hỗ trợ dài hạn, tương thích tốt nhất với PM2, Nginx và Certbot. InterData cung cấp sẵn cả hai image.
- Quyền root hoặc sudo — cần thiết để cài package và cấu hình Nginx/UFW.
- Domain đã trỏ bản ghi A về IP VPS — Certbot không thể cấp SSL nếu domain chưa resolve về đúng máy chủ. Thời gian propagate DNS thường từ 15 phút đến 1 giờ.
- Source code Node.js đã push lên GitHub (hoặc GitLab) — cách deploy chuẩn nhất là kéo code qua
git clone, không upload thủ công.
Nếu chưa có VPS, có thể tham khảo hướng dẫn chọn gói VPS phù hợp trước khi tiếp tục. Còn nếu đã đủ điều kiện — bắt đầu ngay từ Bước 1.
Bước 1: Kết nối SSH và cài môi trường Node.js qua NVM
Cách cài đặt Node.js bằng NVM (Node Version Manager)
Cài Node.js trực tiếp qua apt install nodejs không sai, nhưng version thường bị lỗi thời so với LTS mới nhất. Quan trọng hơn: khi bạn chạy nhiều project Node.js trên cùng một VPS với các version khác nhau (ví dụ: project A dùng Node 18, project B dùng Node 20), apt không thể xử lý được. NVM sinh ra để giải quyết chính xác vấn đề đó.
SSH vào VPS bằng lệnh ssh root@[IP_VPS_CUA_BAN], sau đó cập nhật package list:
apt update && apt upgrade -y
Cài NVM bằng script chính thức từ GitHub:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
Sau khi cài xong, tải lại shell để NVM có hiệu lực:
source ~/.bashrc
Kiểm tra NVM đã nhận chưa:
nvm --version
Cài Node.js phiên bản LTS mới nhất:
nvm install --lts
nvm use --lts
Xác nhận phiên bản đã cài:
node -v
npm -v
Kết quả sẽ trả về số version — ví dụ v20.x.x và 10.x.x. Nếu thấy output này, môi trường Node.js đã sẵn sàng. Lưu ý: đừng bỏ qua bước nvm use --lts — NVM cho phép cài nhiều version cùng lúc, nhưng bạn phải chỉ định version nào đang dùng trong session hiện tại.
![Hướng Dẫn Deploy Node.js Trên VPS: PM2, Nginx & SSL Chi Tiết [2026] 2 NVM cài đặt thành công](https://interdata.vn/blog/wp-content/uploads/2026/03/NVM-cai-dat-thanh-cong.png)
Bước 2: Clone Source Code, Cấu hình .env và Cài thư viện
Đưa code lên VPS và bảo mật file môi trường
Tạo thư mục chứa project tại /var/www/ — đây là convention chuẩn trên Linux cho web application:
mkdir -p /var/www/my-app
cd /var/www/my-app
Kéo source code từ GitHub về:
git clone https://github.com/[USERNAME]/[REPO_NAME] .
Dấu chấm (.) cuối lệnh có nghĩa là clone vào thư mục hiện tại thay vì tạo subfolder mới. Sau khi clone xong, cài dependencies:
npm install
Quan trọng — file .env: Tuyệt đối không push file .env lên Git. Trên VPS, bạn phải tạo thủ công:
nano .env
Điền vào các biến môi trường như PORT, DATABASE_URL, JWT_SECRET… đúng với môi trường production. Lưu bằng Ctrl+O, thoát bằng Ctrl+X.
Nếu project dùng TypeScript hoặc NestJS, cần build trước khi chạy:
npm run build
Lệnh này tạo thư mục dist/ chứa JavaScript đã biên dịch. Bước khởi chạy PM2 phía sau sẽ trỏ vào file trong dist/ thay vì file TypeScript gốc.
Bước 3: Giữ app Node.js luôn chạy ngầm với PM2
PM2 là gì và tại sao bắt buộc phải dùng khi deploy Node.js?
PM2 là Process Manager chuyên dụng cho Node.js, cho phép ứng dụng chạy nền (daemonize) độc lập với phiên SSH, tự động restart khi app crash, và tự khởi động lại sau khi VPS reboot. Đây là lý do PM2 trở thành tiêu chuẩn production thay cho lệnh node app.js trực tiếp: khi chạy bằng node thuần, process sẽ chết ngay khi đóng terminal — PM2 tách biệt hoàn toàn vòng đời của ứng dụng khỏi phiên SSH.
Cài PM2 toàn cục:
npm install pm2 -g
Khởi chạy ứng dụng với PM2 (thay app.js bằng entry point thực tế của project, ví dụ dist/main.js với NestJS):
pm2 start app.js --name "my-app"
Xem trạng thái để xác nhận app đang chạy:
pm2 status
Cột status hiện online là thành công. Bước quan trọng tiếp theo — lưu cấu hình và đăng ký startup:
pm2 save
pm2 startup
Lệnh pm2 startup sẽ in ra một lệnh sudo env PATH=... — bạn cần copy và chạy lệnh đó để PM2 tự khởi động sau khi VPS reboot. Nhiều người bỏ qua bước này, rồi thắc mắc tại sao web tắt sau khi restart VPS. Đừng bỏ qua.
Một vài lệnh PM2 hữu dụng khi vận hành:
pm2 logs my-app— xem log realtimepm2 restart my-app— restart app (dùng khi deploy lại)pm2 monit— dashboard theo dõi CPU, RAM theo thời gian thực
Bước 4: Cấu hình Nginx làm Reverse Proxy và mở Firewall
Reverse Proxy trong Nginx đóng vai trò gì?
Nginx hoạt động như cầu nối giữa internet và ứng dụng Node.js đang lắng nghe trên port nội bộ (thường là 3000). Thay vì người dùng phải gõ yourdomain.com:3000, Nginx nhận request trên port 80 (HTTP) hoặc 443 (HTTPS) rồi chuyển tiếp (proxy_pass) về localhost:3000. Ngoài ra, Nginx còn xử lý tốt hơn Node.js trong việc serve static files, xử lý SSL termination, và chịu tải connection đồng thời — đây là lý do stack production luôn đặt Nginx phía trước Node.js thay vì expose trực tiếp.
Cài Nginx:
apt install nginx -y
Tạo file cấu hình cho domain (thay yourdomain.com bằng domain thực của bạn):
nano /etc/nginx/sites-available/yourdomain.com
Dán vào nội dung Server Block sau:
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
location / {
proxy_pass http://localhost: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;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
}
Kích hoạt cấu hình bằng cách tạo symlink sang sites-enabled:
ln -s /etc/nginx/sites-available/yourdomain.com /etc/nginx/sites-enabled/
nginx -t
Lệnh nginx -t kiểm tra syntax. Nếu output trả về syntax is ok và test is successful, mới reload:
systemctl reload nginx
Mở Firewall UFW — bước hay bị quên: Sau khi cài Nginx, cần cấp quyền cho UFW mới nhận được request từ ngoài vào:
ufw allow 'Nginx Full'
ufw allow OpenSSH
ufw enable
ufw status
Lệnh Nginx Full mở cả port 80 lẫn 443. Lệnh OpenSSH bắt buộc phải allow trước khi enable UFW — nếu không, bạn sẽ bị lock out khỏi chính VPS của mình qua SSH.
Bước 5: Cài đặt chứng chỉ SSL HTTPS miễn phí với Certbot
Bảo mật ứng dụng bằng Let’s Encrypt
Let’s Encrypt là Certificate Authority phi lợi nhuận cung cấp SSL miễn phí, được tin cậy bởi tất cả trình duyệt hiện đại. Certbot là tool chính thức để xin và tự động gia hạn chứng chỉ này. Quan trọng: domain của bạn phải resolve về đúng IP VPS trước bước này, nếu không Certbot sẽ không xác thực được và trả lỗi.
Cài Certbot với plugin Nginx:
apt install python3-certbot-nginx -y
Chạy lệnh cấp chứng chỉ (thay bằng domain thực):
certbot --nginx -d yourdomain.com -d www.yourdomain.com
Certbot sẽ hỏi email để nhận thông báo khi chứng chỉ sắp hết hạn, sau đó tự động chỉnh sửa file cấu hình Nginx, bổ sung SSL và redirect HTTP sang HTTPS. Không cần chỉnh thủ công.
Kiểm tra chứng chỉ đã được cài đúng:
certbot certificates
Chứng chỉ Let’s Encrypt có thời hạn 90 ngày. Certbot tự cài cronjob để gia hạn tự động — bạn không cần làm gì thêm. Để kiểm tra quá trình gia hạn có hoạt động không:
certbot renew --dry-run
Nếu không có lỗi, ứng dụng Node.js của bạn đã chạy trên HTTPS đầy đủ. Truy cập https://yourdomain.com để xác nhận biểu tượng khóa xanh trên trình duyệt.
VPS Giá Rẻ InterData — Sẵn Sàng Deploy Node.js Ngay
VPS giá rẻ tại InterData được cài sẵn Ubuntu 22.04/24.04, kết nối băng thông tốc độ cao, datacenter đặt tại Hà Nội và TP.HCM — thích hợp để triển khai Node.js, NestJS, Express theo hướng dẫn này.
- ✓Ổ cứng SSD NVMe U.2 — I/O nhanh, phù hợp Node.js kèm database
- ✓Toàn quyền quản trị VPS, tự do cài PM2, Nginx, Certbot
- ✓Hỗ trợ kỹ thuật 24/7 — hotline và ticket
FAQs — Câu hỏi thường gặp khi deploy ứng dụng Node.js
Cập nhật code mới lên VPS (deploy lại) như thế nào?
Quy trình deploy lại đơn giản hơn lần đầu nhiều. SSH vào VPS, di chuyển vào thư mục project rồi kéo code mới về:
cd /var/www/my-app
git pull origin main
Nếu có thêm dependency mới, chạy npm install. Với project TypeScript/NestJS, cần build lại: npm run build. Sau đó restart app qua PM2:
pm2 restart my-app
PM2 sẽ tải version mới lên trong khoảng vài giây, downtime gần như bằng không. Nếu muốn zero-downtime deployment, dùng lệnh pm2 reload my-app thay vì restart.
Làm sao để xem nguyên nhân app Node.js bị sập trên VPS?
Dùng lệnh pm2 logs my-app để xem log realtime ngay trên terminal. PM2 sẽ hiển thị chính xác stack trace của lỗi, bao gồm tên file và số dòng gây ra crash. Nếu muốn xem log của các lần sập trước đó (không chỉ session hiện tại), thêm flag --lines 200 để lấy 200 dòng gần nhất:
pm2 logs my-app --lines 200
Lệnh pm2 monit mở dashboard theo dõi CPU, RAM và log đồng thời — tiện hơn khi cần quan sát lâu dài thay vì chỉ debug một sự cố cụ thể.
App Node.js ngốn quá nhiều RAM của VPS thì xử lý sao?
PM2 có tính năng giới hạn RAM và tự restart khi vượt ngưỡng — hữu ích khi app có memory leak hoặc xử lý request lớn không giải phóng memory đúng cách:
pm2 start app.js --name "my-app" --max-memory-restart 500M
Thay 500M bằng mức giới hạn phù hợp với gói VPS đang dùng. Tuy nhiên nếu app liên tục restart vì RAM, đó là dấu hiệu cần xem lại code hoặc nâng cấp cấu hình VPS — --max-memory-restart chỉ là giải pháp tạm thời, không phải vá lỗi gốc.
Kết luận
Triển khai Node.js trên VPS chuẩn production không phức tạp khi bạn hiểu rõ vai trò của từng thành phần: NVM quản lý môi trường linh hoạt, PM2 đảm bảo app không bao giờ tắt ngoài ý muốn, Nginx đứng trước làm Reverse Proxy và xử lý SSL termination, Certbot cấp HTTPS miễn phí tự động gia hạn. Bốn thứ này kết hợp với nhau tạo ra stack vừa ổn định vừa bảo mật — đủ để go-live thực sự, không chỉ chạy thử.
Một điểm dễ bỏ qua: sau bước pm2 startup, nhớ chạy lệnh sudo mà PM2 in ra — đây là bước đăng ký service với systemd để PM2 tự khởi động sau reboot. Thiếu bước này, mọi cấu hình sẽ bị mất sau lần tắt máy VPS đầu tiên.
Nếu muốn đi sâu hơn vào phần hạ tầng, bài cẩm nang sử dụng VPS từ A đến Z sẽ giúp bạn nắm toàn cảnh trước khi bắt tay vào các cấu hình nâng cao hơn như load balancing hoặc multi-process với PM2 cluster mode.
