Hướng dẫn Deploy ứng dụng Node.js lên Production từ A đến Z: Quy trình chuẩn với PM2 và Nginx
Chào anh em!
Sau khi xây dựng xong một ứng dụng Node.js (sử dụng Express, NestJS hoặc Koa) chạy mượt mà ở môi trường Local, bước tiếp theo là đưa nó lên môi trường thực tế (Production).
Khác với PHP có FPM/Web Server quản lý sẵn luồng, Node.js vận hành như một Server độc lập và chạy theo cơ chế đơn luồng (Single-threaded). Do đó, nếu bạn chỉ gõ lệnh node index.js trên máy chủ, khi ứng dụng gặp lỗi văng ngoại lệ (Crash) hoặc SSH bị ngắt kết nối, toàn bộ hệ thống sẽ ngưng hoạt động ngay lập tức.
Hôm nay, hãy cùng mổ xẻ quy trình chuẩn hóa từng bước để Deploy một ứng dụng Node.js lên máy chủ Linux (Ubuntu) đảm bảo tính ổn định, tự động khôi phục khi sập nguồn và tối ưu hiệu năng cao nhất nhé!
Tổng quan kiến trúc hệ thống Production
Một mô hình triển khai Node.js chuẩn mực thường bao gồm 3 thành phần chính:
[Internet / User] ---> [Nginx (Reverse Proxy + SSL)] ---> [PM2 (Process Manager)] ---> [Node.js App (Port 3000)]
- Nginx: Đóng vai trò là Reverse Proxy hứng request ở cổng 80/443, quản lý SSL/HTTPS và chuyển tiếp (forward) dữ liệu vào ứng dụng Node.js.
- PM2: Người quản lý tiến trình ngầm, giúp ứng dụng Node.js chạy liên tục, tự động restart khi code bị crash hoặc khi máy chủ bị khởi động lại.
Bước 1: Chuẩn bị mã nguồn & Biến môi trường
Trước khi đưa code lên máy chủ Linux, hãy đảm bảo dự án của bạn được cấu hình chuẩn mực:
- Thiết lập biến môi trường (
.env): Chắc chắn rằng ứng dụng của bạn nhận cổng (Port) và môi trường chạy thông qua biến môi trường:NODE_ENV=production PORT=3000 DB_HOST=127.0.0.1 DB_USER=your_db_user DB_PASS=your_db_password - Chỉ cài đặt Dependencies cần thiết (Production):
Trên server Linux, khi tiến hành cài đặt thư viện, chỉ sử dụng lệnh nạp các package chính (bỏ qua
devDependenciesnhưnodemon,jest... để tiết kiệm bộ nhớ):npm ci --only=production
Bước 2: Quản lý tiến trình ngầm bằng PM2 (Process Manager)
PM2 là công cụ "bất ly thân" của lập trình viên Node.js khi deploy. Nhờ PM2, ứng dụng sẽ chạy ẩn dưới dạng background daemon.
1. Cài đặt PM2 toàn cục (Global)
Trên máy chủ Ubuntu, chạy lệnh:
sudo npm install -g pm2
2. Khởi chạy ứng dụng với PM2
Di chuyển vào thư mục dự án và chạy lệnh khởi động:
pm2 start server.js --name "my-node-app"
3. Bật chế độ Cluster Mode (Tận dụng toàn bộ nhân CPU)
Mặc định Node.js chỉ chạy trên 1 nhân CPU. PM2 cho phép bạn bật chế độ Cluster để nhân bản ứng dụng lên tất cả các nhân CPU của server, giúp tăng tải gấp nhiều lần:
# Chạy ứng dụng trên tất cả các nhân CPU sẵn có
pm2 start server.js -i max --name "my-node-app"
4. Cấu hình tự khởi động cùng hệ thống (Auto-restart on Reboot)
Để đảm bảo khi máy chủ server bị restart, ứng dụng Node.js của bạn tự động bật lại mà không cần bạn phải gõ lệnh thủ công:
pm2 save
pm2 startup
(Lệnh pm2 startup sẽ xuất ra một dòng lệnh script, bạn chỉ cần copy dòng lệnh đó dán lại vào Terminal là xong).
Bước 3: Cấu hình Nginx làm Reverse Proxy
Chúng ta không nên mở trực tiếp cổng 3000 của Node.js ra ngoài Internet vì lý do bảo mật và hiệu năng. Thay vào đó, hãy sử dụng Nginx làm người gác cổng.
1. Cài đặt Nginx
sudo apt update
sudo apt install nginx -y
2. Tạo file cấu hình Site cho dự án
Tạo một file cấu hình mới tại đường dẫn /etc/nginx/sites-available/my-node-app:
sudo nano /etc/nginx/sites-available/my-node-app
Dán đoạn cấu hình Nginx Reverse Proxy chuẩn sau vào:
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
location / {
proxy_pass http://127.0.0.1:3000; # Trỏ về cổng mà Node.js đang chạy
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
3. Kích hoạt cấu hình và khởi động lại Nginx
# Tạo liên kết tới thư mục sites-enabled
sudo ln -s /etc/nginx/sites-available/my-node-app /etc/nginx/sites-enabled/
# Kiểm tra xem cú pháp file cấu hình Nginx có bị lỗi không
sudo nginx -t
# Khởi động lại Nginx
sudo systemctl restart nginx
Bước 4: Cài đặt SSL miễn phí (HTTPS) với Certbot
Để bảo mật dữ liệu truyền tải giữa client và server, việc cài đặt HTTPS cho domain là bắt buộc. Chúng ta sẽ dùng Certbot (Let's Encrypt) để tự động hóa việc này:
# Cài đặt Certbot plugin cho Nginx
sudo apt install certbot python3-certbot-nginx -y
# Cài đặt chứng chỉ SSL tự động
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
Certbot sẽ tự động chỉnh sửa file cấu hình Nginx của bạn, bật HTTPS (cổng 443) và thiết lập cơ chế tự động gia hạn chứng chỉ mỗi 90 ngày.
Bước 5: Một số câu lệnh PM2 hữu ích cần nhớ
Trong quá trình bảo trì ứng dụng, bạn sẽ thường xuyên tương tác với PM2 bằng các câu lệnh sau:
pm2 list: Xem danh sách tất cả các ứng dụng Node.js đang chạy.pm2 logs: Xem log hiển thị realtime (tương đươngconsole.log).pm2 restart my-node-app: Khởi động lại ứng dụng khi vừa cập nhật code mới.pm2 monit: Mở bảng điều khiển giám sát dung lượng RAM và CPU mà ứng dụng đang tiêu thụ.
Lời kết
Deploy một ứng dụng Node.js lên Production không quá phức tạp nếu bạn đi đúng lộ trình: Đóng gói mã nguồn Quản lý tiến trình ngầm với PM2 Thiết lập Nginx Reverse Proxy Cài đặt HTTPS. Mô hình này đảm bảo cho hệ thống Backend của bạn vận hành liên tục, an toàn, chịu tải tốt và dễ dàng mở rộng trong tương lai!
All rights reserved