Table of Contents

Join CloudFly's Telegram channel to receive more offers and never miss any promotions from CloudFly

Giới thiệu về cách triển khai ứng dụng NestJS với Nginx trên VPS Ubuntu

Posted on: July 17, 2025

description image

Giới thiệu

Các nhà phát triển hiện đại thích sử dụng JavaScript cả front-end và back-end. Express.js là một framework backend JavaScript tuyệt vời, được đa số nhà phát triển sử dụng. Tuy nhiên, kiến trúc tối giản của Express.js không phù hợp cho việc mở rộng và bảo trì bởi các nhóm lớn. Đây là lúc Nest.js phát huy tác dụng. Nest.js có kiến trúc tích hợp sẵn, phù hợp cao cho việc mở rộng và triển khai. Ngoài ra, hỗ trợ native cho TypeScript giúp tăng năng suất cho nhà phát triển so với JavaScript thuần.

Trong hướng dẫn này, bạn sẽ học cách triển khai ứng dụng NestJS sử dụng máy chủ web Nginx trên VPS. Bạn sẽ học cách đưa ứng dụng của mình lên web với độ bảo mật cần thiết.

Yêu cầu trước

Trước khi bắt đầu hướng dẫn, bạn cần đáp ứng các yêu cầu sau:

  • VPS Ubuntu 20.04+ hoặc máy vật lý chạy Ubuntu. (Trong hướng dẫn này chúng ta sẽ sử dụng Ubuntu 22.04 trên VPS)
  • Node.js và trình quản lý gói npm (hoặc yarn).
  • Máy chủ web Nginx. <details open> <summary> Bước 1 - Chuẩn bị và Triển khai Ứng dụng NestJS </summary>

Trong phần này, bạn sẽ cài đặt NestJS CLI và tạo một ứng dụng NestJS cơ bản, mà bạn sẽ học cách triển khai sử dụng Nginx ở phần tiếp theo.

Cài đặt NestJS CLI toàn cục

Để cài đặt NestJS CLI trên máy Ubuntu, mở terminal và nhập lệnh sau:

npm i -g @nestjs/cli

Lệnh này sẽ cài đặt giao diện dòng lệnh NestJS trên máy của bạn. Tiếp theo, bạn sẽ học cách tạo một dự án NestJS mới.

Tạo dự án NestJS mới

Hiện nay, NestJS cung cấp hai cách để bắt đầu một dự án mới. Bạn có thể chọn phương pháp phù hợp nhất với mình.

Sử dụng NestJS CLI

Nhập lệnh sau để tạo dự án NestJS với CLI:

nest new <project-name>

Bạn sẽ nhận được một câu hỏi lựa chọn trình quản lý gói muốn dùng:

? Which package manager would you ❤️ to use? (Use arrow keys) › npm yarn pnpm

Sau khi hoàn thành sẽ có đầu ra như sau:

CREATE node_app/.eslintrc.js (663 bytes) CREATE node_app/.prettierrc (51 bytes) CREATE node_app/README.md (3340 bytes) CREATE node_app/nest-cli.json (171 bytes) CREATE node_app/package.json (1947 bytes) CREATE node_app/tsconfig.build.json (97 bytes) CREATE node_app/tsconfig.json (546 bytes) CREATE node_app/src/app.controller.ts (274 bytes) CREATE node_app/src/app.module.ts (249 bytes) CREATE node_app/src/app.service.ts (142 bytes) CREATE node_app/src/main.ts (208 bytes) CREATE node_app/src/app.controller.spec.ts (617 bytes) CREATE node_app/test/jest-e2e.json (183 bytes) CREATE node_app/test/app.e2e-spec.ts (630 bytes)

Lệnh trên tạo dự án mới trong thư mục đang làm việc hiện tại. Bạn cũng có thể cung cấp đường dẫn tuyệt đối tới thư mục khác thay vì <project-name>.

Clone mẫu khởi đầu

NestJS cung cấp cách khác để bắt đầu dự án mới bằng cách clone repository mẫu khởi đầu. Bạn dùng lệnh:

git clone https://github.com/nestjs/typescript-starter.git <project-directory>

Sau khi clone xong, bạn cần chuyển vào thư mục dự án và chạy npm install để cài các dependencies trong package.json:

cd <project-directory> npm install

Khi dự án sẵn sàng, bạn có thể chạy máy chủ ứng dụng bằng lệnh:

npm run start

Ứng dụng sẽ chạy trên http://localhost:3000. Bây giờ bạn đã có một ứng dụng NestJS cơ bản chạy trên localhost.

Kiểm thử ứng dụng

Sau khi phát triển ứng dụng, bạn có thể chạy kiểm thử để xem ứng dụng hoạt động đúng không. NestJS cung cấp các kiểm thử Jest mặc định. Bạn bắt đầu kiểm thử bằng lệnh:

npm run test

Kết quả kiểm thử sẽ tương tự như sau:

node_app@0.0.1 test jest PASS src/app.controller.spec.ts AppController root ✓ should return "Hello World!" (24 ms) Test Suites: 1 passed, 1 total Tests: 1 passed, 1 total Snapshots: 0 total Time: 2.895 s Ran all test suites.

Phần tiếp theo bạn sẽ học cách triển khai ứng dụng NestJS này lên máy chủ web sử dụng Nginx làm reverse proxy.

</details>

<details open> <summary> Bước 2 - Cấu hình Nginx phục vụ ứng dụng NestJS </summary>

Bây giờ ta tiến hành thiết lập webserver để host ứng dụng NestJS. Ta sẽ dùng phương pháp reverse proxy. Phương pháp này chạy ứng dụng trên localhost ở một cổng nhất định rồi dùng Nginx để chuyển tiếp các yêu cầu tới IP công khai hoặc domain của VPS tới ứng dụng localhost. Reverse proxy giúp tăng cường bảo mật bằng cách tạo lớp ngăn cách giữa các yêu cầu vào và ứng dụng backend. Ngoài ra còn giúp quản lý tải tốt hơn khi server host nhiều ứng dụng.

Ta bắt đầu cài trình quản lý tiến trình pm2 để quản lý runtime của ứng dụng.

Cài đặt pm2

Dùng lệnh sau để cài pm2:

npm install -g pm2

Lệnh này cài pm2 toàn cục trên máy.

Tạo cấu hình Nginx cho ứng dụng NestJS

Cấu hình Nginx để chạy ứng dụng. Đảm bảo bạn đã cho phép ứng dụng Nginx qua firewall cho HTTP và HTTPS như hướng dẫn ở phần yêu cầu. Nếu dùng ufw, bạn có thể dùng:

ufw enable ufw allow ‘Nginx Full‘

Tạo file cấu hình mới cho ứng dụng:

sudo nano /etc/nginx/sites-available/your_domain

(Thay your_domain bằng tên domain hoặc ứng dụng của bạn)

Trong trình soạn thảo, nhập cấu hình sau:

server { server_name your_domain www.your_domain; 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_cache_bypass $http_upgrade; } }

Tạo symlink để kích hoạt config:

sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

Vô hiệu hóa liên kết mặc định tránh redirect tất cả yêu cầu sang site mặc định:

sudo unlink /etc/nginx/sites-enabled/default

Khởi động lại dịch vụ Nginx:

sudo systemctl restart nginx

Triển khai ứng dụng NestJS qua Nginx

Khởi động ứng dụng NestJS với pm2, trong thư mục ứng dụng, chạy:

pm2 start npm --name "your_domain" -- start

Cấu hình pm2 tự khởi động khi server reboot:

pm2 startup

Lưu list tiến trình pm2:

pm2 save

Bây giờ ứng dụng đã được thiết lập chạy tự động và Nginx được cấu hình reverse proxy đến ứng dụng localhost.

Kiểm thử ứng dụng web

Test ứng dụng web từ console:

curl http://localhost

Vì đã thiết lập reverse proxy trên IP server, mọi yêu cầu tới IP công khai, domain hoặc localhost sẽ chuyển tới ứng dụng NestJS your_domain.

Đầu ra dự kiến:

Hello World!

Phần kế tiếp bạn sẽ học cách thêm SSL vào ứng dụng để sử dụng HTTPS.

</details>

<details open> <summary> Bước 3 - Thêm SSL sử dụng Let’s Encrypt (Tùy chọn) </summary>

Tới đây bạn đã biết cách triển khai ứng dụng NestJS hoàn chỉnh với Nginx. Tuy nhiên, hiện đang dùng giao thức HTTP không khuyến khích trong môi trường production do thiếu bảo mật. Bạn nên chuyển sang HTTPS - phiên bản HTTP được mã hóa sử dụng chứng chỉ SSL/TLS do các đơn vị chứng nhận cung cấp. Các chứng chỉ này là riêng cho từng website và mã hóa truyền thông giữa client và server.

Phần này hướng dẫn thêm chứng chỉ SSL Let’s Encrypt cho trang của bạn.

Lưu ý: Để thực hiện bước này bạn cần có bản ghi A cho domain của mình. Trong ví dụ này dùng your_domain, bạn nên thêm SSL chỉ khi đã thêm domain cho website.

Cài đặt Certbot CLI của Let’s Encrypt

Let’s Encrypt cung cấp công cụ CLI để quản lý và tự động chứng chỉ SSL. Cài bằng lệnh:

sudo apt install certbot python3-certbot-nginx

Lệnh trên cài client certbot cho VPS Ubuntu của bạn.

Lấy chứng chỉ SSL/TLS cho domain

Bạn lấy chứng chỉ cho domain bằng lệnh:

sudo certbot --nginx -d <your_domain> -d <www.your_domain>

Thay your_domain bằng tên domain thực tế. Lần đầu chạy certbot trên VPS, bạn sẽ được yêu cầu nhập email và đồng ý điều khoản.

Lưu ý: Việc này chỉ thành công nếu bạn có domain hợp lệ và đã liên kết domain với ứng dụng NestJS.

Sau khi chứng chỉ được cài, bạn có thể cấu hình redirect tất cả yêu cầu sang HTTPS để đảm bảo an toàn.

Thông tin: Chứng chỉ Let’s Encrypt có thời hạn 90 ngày, nhưng certbot tự động gia hạn nên bạn không cần lo lắng kiểm tra thường xuyên.

Kết luận

Trong hướng dẫn này, bạn đã học cách triển khai ứng dụng NestJS trên môi trường production bằng VPS Ubuntu cùng server Nginx. Bạn cũng biết cách thiết lập dự án NestJS và reverse proxy dùng Nginx. Cuối cùng, bạn học cách thêm chứng chỉ SSL/TLS cho domain của server, bảo đảm sự toàn vẹn trong giao tiếp giữa client và server.

Bạn có thể mở rộng kiến thức bằng cách tạo các ứng dụng NestJS phức tạp hơn, bao gồm tích hợp database, validator đầu vào, v.v.

Join CloudFly's Telegram channel to receive more offers and never miss any promotions from CloudFly
Share

0 replies