Hướng dẫn triển khai ứng dụng NestJS trên Ubuntu VPS với Nginx

Posted on: July 17, 2025

Ubuntu

description image Ứng dụng web hiện đại thường sử dụng JavaScript cho cả frontend và backend. Express.js là framework backend JavaScript phổ biến, tuy nhiên kiến trúc tối giản của nó 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 vai trò với kiến trúc tích hợp sẵn, rất thích hợp cho việc mở rộng và triển khai. Hơn nữa, Nest.js hỗ trợ TypeScript nguyên bản, làm tăng năng suất cho nhà phát triển so với JavaScript thuần.

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

Yêu cầu trước khi bắt đầu

Trước khi tiếp tục, bạn cần:

  • VPS hoặc máy vật lý chạy Ubuntu 20.04 trở lên (bài này dùng Ubuntu 22.04 trên VPS).
  • Node.js và trình quản lý gói npm hoặc yarn. Bạn có thể tham khảo hướng dẫn cài Node.js trên Ubuntu.
  • Máy chủ web Nginx, có thể cài theo hướng dẫn cài Nginx trên Ubuntu.

Bước 1 - Chuẩn bị và triển khai ứng dụng NestJS

Ở phần này, bạn sẽ cài NestJS CLI và tạo một ứng dụng NestJS đơn giản để triển khai dùng Nginx ở các bước sau.

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

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

npm i -g @nestjs/cli

Lệnh này sẽ cài giao diện dòng lệnh NestJS cho máy.

Tạo dự án NestJS mới

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

Dùng NestJS CLI

Nhập lệnh sau để tạo dự án bằng CLI:

nest new <tên_dự_án>

Bạn sẽ được chọn trình quản lý gói bạn muốn dùng như npm, yarn hoặc pnpm.

Sau khi hoàn thành, kết quả khoảng 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 tạo mới dự án trong thư mục làm việc hiện tại. Bạn cũng có thể cung cấp đường dẫn tuyệt đối thay vì tên dự án.

Clone template mẫu

Một cách khác là clone kho git mẫu khởi tạo dự án:

git clone https://github.com/nestjs/typescript-starter.git <thư_mục_dự_án>

Sau khi clone, vào thư mục dự án và chạy:

cd <thư_mục_dự_án> npm install

Sau đó khởi động server bằng:

npm run start

Ứng dụng sẽ chạy tại http://localhost:3000, bạn đã có ứng dụng NestJS cơ bản chạy trên localhost.

Kiểm thử ứng dụng

Sau khi phát triển, bạn có thể chạy test để kiểm tra ứng dụng.

npm run test

Kết quả trả về có dạng:

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 kế tiếp, bạn sẽ học cách triển khai ứng dụng NestJS bằng Nginx làm reverse proxy.

Bước 2 - Thiết lập Nginx để phục vụ ứng dụng NestJS

Tiếp theo, chúng ta sẽ cấu hình webserver để host ứng dụng NestJS. Sử dụng kỹ thuật reverse proxy, ứng dụng sẽ chạy trên localhost cổng nhất định, Nginx sẽ proxy yêu cầu từ IP công khai hoặc domain tới ứng dụng localhost. Reverse proxy tạo lớp bảo vệ giữa yêu cầu đến và backend, đồng thời cải thiện quản lý tải trên server khi hosting nhiều ứng dụng.

Cài đặt pm2 Process Manager

Cài đặt pm2 để quản lý runtime ứng dụng bằng lệnh:

npm install -g pm2

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

Cấu hình Nginx chạy ứng dụng, nhớ cho phép Nginx trong firewall với HTTP và HTTPS. Nếu dùng ufw firewall:

ufw enable ufw allow 'Nginx Full'

Tạo block cấu hình mới cho app:

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

Thay your_domain thành tên ứng dụng. Nội dung file:

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 giúp Nginx nhận cấu hình:

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

Và xóa liên kết mặc định để tránh redirect sai:

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

Khởi động lại Nginx:

sudo systemctl restart nginx

Triển khai ứng dụng NestJS với Nginx

Khởi chạy ứng dụng với pm2 từ thư mục ứng dụng:

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

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

pm2 startup

Lưu cấu hình pm2 hiện tại:

pm2 save

Ứng dụng sẽ khởi động cùng máy chủ, Nginx sẽ reverse proxy đến app trên localhost.

Kiểm thử ứng dụng web

Kiểm tra từ console server:

curl http://localhost

Request đến IP công khai, domain hoặc localhost sẽ được chuyển đến ứng dụng NestJS your_domain.

Kết quả:

Hello World!

Ở phần sau, bạn sẽ học cách thêm SSL để dùng HTTPS cho ứng dụng.

Bước 3 - Thêm SSL dùng Let’s Encrypt (Tùy chọn)

Bạn đã biết cách deploy ứng dụng NestJS chạy trên Nginx với HTTP. Tuy nhiên, HTTP không an toàn cho môi trường sản xuất do dễ bị khai thác. HTTPS - phiên bản mã hóa của HTTP - dùng các chứng chỉ SSL/TLS do CA cung cấp để mã hóa truyền thông giữa khách và server.

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

Cài công cụ quản lý và tự động SSL:

sudo apt install certbot python3-certbot-nginx

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

Chạy lệnh lấy chứng chỉ:

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

Thay your_domain bằng tên domain thật của bạn. Lần đầu dùng certbot sẽ yêu cầu nhập email và đồng ý điều khoản sử dụng.

Chú ý: Chỉ thực hiện phần này khi bạn có chứng chỉ A trỏ về domain.

Sau khi cài xong, nên redirect tất cả request về HTTPS để đảm bảo tính toàn vẹn website.

Thông tin thêm: Chứng chỉ do certbot cấp có thời hạn 90 ngày, certbot sẽ tự động gia hạn, bạn không cần can thiệp thường xuyên.

Kết luận

Trong bài này, bạn đã học cách deploy ứng dụng NestJS trên Ubuntu VPS dùng Nginx, thiết lập dự án và reverse proxy, cùng với việc thêm chứng chỉ SSL/TLS để bảo mật giao tiếp giữa client và server.

Bạn có thể phát triển thêm với các ứng dụng NestJS phức tạp hơn, tích hợp cơ sở dữ liệu, bộ kiểm tra đầu vào, v.v.

Tác giả lựa chọn OWASP Foundation nhận đóng góp trong chương trình Write for Donations.

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

0 replies