0

Bài 1 Làm chủ Supervisor cho Node.js: Quản lý tiến trình ứng dụng Express/NestJS mượt mà như Laravel

Chào anh em đồng nghiệp trên Viblo! Ở các bài viết trước, chúng ta đã cùng nhau làm chủ Supervisor trong hệ sinh thái Laravel Queue [cite: 17]. Tuy nhiên, lập trình viên Backend hiện đại thường dịch chuyển qua lại giữa nhiều ngôn ngữ, và Node.js (với Express, NestJS, Fastify) là một trạm dừng chân cực kỳ phổ biến.

Khi làm việc với Node.js, chắc hẳn anh em đã quá quen thuộc với Nodemon (dùng khi dev để tự reload code) hay PM2 (công cụ "quốc dân" để quản lý tiến trình Node.js trên production). Vậy tại sao chúng ta lại cần nói đến Supervisor ở đây?

Trong bài học đầu tiên này, hãy cùng mổ xẻ lý thuyết cốt lõi và tìm hiểu lý do tại sao Supervisor lại là một lựa chọn cực kỳ đáng tin cậy ở cấp độ hệ điều hành (OS-level process manager).

1. Phân biệt các khái niệm: Nodemon vs PM2 vs Supervisor

Để không bị nhầm lẫn, chúng ta hãy đặt ba công cụ này lên bàn cân:

  • Nodemon: Công cụ thuần túy phục vụ cho môi trường Development. Nó quan sát sự thay đổi file (fs.watch) và restart lại ứng dụng Node.js. Tuyệt đối không dùng Nodemon trên Production vì tốn tài nguyên và không an toàn.
  • PM2: Process manager chuyên dụng được viết bằng Node.js, sinh ra để dành riêng cho hệ sinh thái JavaScript. Nó cực kỳ mạnh mẽ, hỗ trợ Cluster Mode, log management, và built-in metrics.
  • Supervisor (supervisord): Process control system cấp hệ thống (viết bằng Python). Nó quản lý mọi loại tiến trình trên Linux (từ PHP worker, Python script, đến Node.js app, Go binary).

👉 Vậy khi nào nên chọn Supervisor cho Node.js? Nếu hệ thống của bạn là một kiến trúc Microservices thuần túy chạy trên Ubuntu Linux, nơi bạn muốn quản lý đồng nhất mọi dịch vụ (cả PHP worker, ứng dụng NestJS, dịch vụ Python AI, v.v.) bằng một công cụ cấp hệ thống duy nhất thông qua systemctl và cấu hình chuẩn Unix, thì Supervisor là một mảnh ghép hoàn hảo. Nó không phụ thuộc vào môi trường Node.js nên nếu bản thân runtime Node.js gặp sự cố sâu, Supervisor vẫn đứng vững ở tầng OS để bám trụ và phục hồi tiến trình.

2. Vấn đề thực tế: Chạy Node.js app trực tiếp trên Production có gì nguy hiểm?

Khi bạn triển khai một ứng dụng Node.js lên server, cách thô sơ nhất là chạy:

node dist/main.js
# hoặc dùng npm run start:prod

Mô hình này ẩn chứa những rủi ro chí mạng:

  • Ứng dụng chết là sập luôn: Node.js chạy trên một luồng đơn (Single-threaded event loop). Nếu code của bạn vô tình dính một ngoại lệ chưa được bắt (Uncaught Exception) hoặc lỗi tràn bộ nhớ heap (Fatal Error), tiến trình sẽ văng ra và ứng dụng offline hoàn toàn, khách hàng không thể truy cập được nữa.
  • Mất kết nối SSH là tắt app: Tiến trình chạy trên foreground terminal sẽ chết ngay khi bạn đóng phiên làm việc SSH.
  • Không tự khởi động sau khi reboot server: Khi server bảo trì khởi động lại, dịch vụ Node.js của bạn sẽ nằm im lìm trừ khi bạn chủ động đăng nhập vào bật lại thủ công.

3. Sơ đồ mô hình vận hành Node.js app dưới sự bảo hộ của Supervisor

+-------------------------------------------------------+
|                    Ubuntu / Linux                     |
|                                                       |
|  +-------------------------------------------------+  |
|  |             Supervisor (supervisord)            |  |
|  |                                                 |  |
|  |          +---------------------------+          |  |
|  |          | Node.js App (NestJS/Express)|        |  |
|  |          +-------------+-------------+          |  |
|  |                        |                        |  |
|  +------------------------+------------------------+  |
|                           | (Theo dõi & Tự động hồi phục)
|                           v                           |
|  +-------------------------------------------------+  |
|  |           Node Runtime (node dist/main.js)      |  |
|  +-------------------------------------------------+  |
+-------------------------------------------------------+

Khi ứng dụng Node.js của bạn gặp sự cố đột ngột và chết đi, Supervisor sẽ đóng vai trò là người gác cổng, ngay lập tức phát hiện trạng thái thoát và tiến hành kích hoạt lại (spawn) một tiến trình Node.js hoàn toàn mới chỉ trong vòng tích tắc.


Tóm tắt Bài 1

  • Chúng ta đã hiểu rõ bối cảnh sử dụng Supervisor cho ứng dụng Node.js so với PM2 hay Nodemon truyền thống.
  • Nhận diện các hiểm họa khi chạy trực tiếp ứng dụng Node.js trên môi trường production mà không có trình quản lý tiến trình cấp hệ thống.
  • Hẹn gặp lại anh em ở Bài 2: Chúng ta sẽ bước vào phần Thực hành, hướng dẫn cách viết file cấu hình .conf chuẩn chỉnh để chạy một ứng dụng NestJS hoặc Express bứt phá hiệu năng trên Ubuntu!

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í