0

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 devDependencies như 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 đương console.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 \rightarrow Quản lý tiến trình ngầm với PM2 \rightarrow Thiết lập Nginx Reverse Proxy \rightarrow 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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí