PM2 là gì? Trình quản lý các ứng dụng viết bằng NodeJS

Bài viết được sự cho phép của tác giả Tống Xuân Hoài

Vấn đề

Khi mới tiếp xúc với Node.js và cũng là lần đầu học cách sử dụng Linux, nodemon là một thư viện mà tôi thường hay sử dụng để phát triển ứng dụng, vì chỉ cần lưu mã thì ngay lập tức nó sẽ “nạp” lại mã mới mà không cần phải “kill” đi bật lại ứng dụng một cách thủ công nữa, tính năng này ngày nay còn được gọi là “hot reload”.

Sau bước phát triển là bước triển khai. Trong lúc thực hành chạy ứng dụng ở trên máy chủ, loay hoay mãi không biết làm sao để chạy được nó. Nếu dùng cách thông thường là gõ “node index.js” hoặc thậm chí dùng cả nodemon thì cứ mỗi khi thoát khỏi terminal, thoát khỏi máy chủ, thì ứng dụng cũng “bay màu” theo mất. Tôi hiểu rằng ứng dụng sẽ bị thoát nếu như không giữ được kết nối đến máy chủ. Thế là sao?

Mãi sau mới biết thì ra để giữ cho ứng dụng được chạy mãi, chúng ta cần phải có một công cụ quản lý tiến trình. Không chỉ cho riêng Node mà hầu hết các ngôn ngữ khác cũng cần phải có. Đối với Node thì cái tên được nhắc đến nhiều nhất có lẽ là pm2.

Từ khi biết đến pm2, tôi đã có thể dễ dàng triển khai các ứng dụng của mình. Cứ thế cho đến một thời gian sau, được làm nhiều dự án và tiếp xúc với nhiều công nghệ khác như Docker, Kubernetes… thì pm2 dần trở nên không còn cần thiết nữa, vì về bản chất các công cụ đó đã tích hợp sẵn công cụ dành cho quản lý.

Gần đây, khi đang bảo trì nhiều dự án, mà hầu hết chúng đều dùng pm2 thì tôi phải dành thời gian đọc lại tài liệu về cách sử dụng vì đã lâu rồi chưa đụng đến. Lúc đó chợt nhận ra đã có quá nhiều thay đổi trong khoảng thời gian đó. Nhiều tính năng mới được thêm vào hoặc cũng có thể là những tính năng mà mình chưa được biết đến.

Nhưng phải thành thật mà nói rằng pm2 vẫn là công cụ quản lý ứng dụng Node.js rất mạnh mẽ. Bất kỳ ai làm việc với Node cũng nên dành thời gian để tìm hiểu về nó. Vì thế bài viết ngày hôm nay tôi sẽ điểm lại một vài tính năng chính của công cụ này.

PM2 là gì?

pm2 là trình quản lý tiến trình daemon giúp bạn quản lý và duy trì ứng dụng luôn luôn trực tuyến.

Cài đặt pm2 rất đơn giản, thông qua npm tích hợp sẵn trong Node.

$ npm install pm2@latest -g

Sau đó bạn đã có thể khởi động ứng dụng Node của mình:

$ pm2 start app.js

Ứng dụng được chạy trong nền, để xem tất cả ứng dụng đang chạy:

$ pm2 list

Điều hữu ích nhất ở pm2 là nó giữ được ứng dụng chạy ở dưới nền, nghĩa là bạn có thoát khỏi máy chủ thì ứng dụng của bạn vẫn chạy.

Hầu hết mọi người đều biết khi chạy một ứng dụng Node, nó chỉ chạy trên một lõi của CPU. Nếu máy tính đa nhân thì Cluster mode sẽ giúp dàn trải tất cả tiến trình đến các lõi còn lại. Ví dụ CPU có 4 lõi, bạn muốn chạy trên cả 4 thì rất đơn giản.

$ pm2 start app.js -i max

max là chỉ định tất cả nhân đều tham gia, ngoài ra nếu muốn chính xác bao nhiêu thì thay max bằng một con số.

pm2 có cơ chế ghi logs vào tệp để truy xuất thông tin sau này. Các thông tin đó bao gồm các lệnh in vào console như console.log. Để xem lại logs:

$ pm2 logs 0

Với 0 là id của tiến trình hoặc thay nó bằng tên của tiến trình.

Để dừng một tiến trình:

$ pm2 stop 0

Chạy lại sau khi dừng:

$ pm2 start 0

Hoặc khởi động lại:

$ pm2 restart 0

Hoặc xoá hẳn ứng dụng với điều kiện nó phải được cho dừng từ trước:

$ pm2 delete 0

Các lệnh pm2 start là rời rạc và đơn lẻ. Tưởng tượng thay vì có một mà là có nhiều tiến trình Node cần khởi động cùng một lúc thì sao? Đó là lúc ecosystem trở nên hữu ích. ecosystem là cơ chế gom tất cả ứng dụng vào một tệp cấu hình và khởi động trong một lệnh duy nhất.

Để tạo một tệp cấu hình, sử dụng lệnh pm2 ecosystem, pm2 tạo ra một tệp ecosystem.config.js giống như sau:

module.exports = {
  apps : [{
    name: "app",
    script: "./app.js",
    env: {
      NODE_ENV: "development",
    },
    env_production: {
      NODE_ENV: "production",
    }
  }, {
     name: 'worker',
     script: 'worker.js'
  }]
}

Hãy sửa lại cấu hình cho phù hợp với dự án rồi khởi động nó bằng cách:

$ pm2 start ecosystem.config.js

Trong trường hợp máy chủ khởi động lại, pm2 không tự động khởi động theo khiến cho tất cả ứng dụng không hoạt động. Để giải quyết vấn đề này, sử dụng lệnh:

$ pm2 startup

Nhưng trước đó, bạn cần “commit” các tiến trình sẽ khởi động theo startup bằng lệnh:

$ pm2 save

pm2 save tạo ra một “snapshot” các tiến trình đang chạy tại thời điểm hiện tại để phục hồi lại tất cả sau này.

  Logging ứng dụng viết bằng node.js qua 3 cấp độ

  Khi nào nên sử dụng cluster trong Node.js – đa luồng trong Node.js

PM2 nâng cao

Pm2 có một số tính năng nâng cao tương đối hữu ích trong một số trường hợp.

RPC Function hoạt động theo kiểu chạy một hàm thông qua dòng lệnh. Ví dụ có một hàm countActive trả về số người đang trực tuyến thời điểm hiện tại.

Trước tiên, tạo một tệp rpc.js có nội dung:

const tx2 = require('tx2');

tx2.action('countActive', (reply) => {
  const num = UserModel.count();
  reply({ num: num });
})

setInterval(function() {
  // Keep application online
}, 100);

Khởi chạy:

$ pm2 start rpc.js

Sau đó nếu muốn kích hoạt hàm countActive thì chỉ cần:

pm2 trigger rpc countActive

Pm2 cũng cung cấp một API để quản lý pm2 thông qua RESTFul API. Hiểu đơn giản tức là bạn có thể tạo ra một máy chủ để thêm/sửa/xoá các ứng dụng khác dùng pm2, thực hiện qua việc gọi API. Bạn đọc có thể xem chi tiết tại PM2 API.

Và một vài tính năng nâng cao khác nữa.

Gần đây, pm2 còn ra thêm dịch vụ pm2 plus cho phép giám sát ứng dụng một cách toàn diện như giao diện giám sát thời gian thực, báo cáo, nhật ký, và cả notifications… Có thể thấy nó khá tương đồng với các ứng dụng APM (Application Performance Monitoring). Nhưng vì không có gói miễn phí nên tôi chưa có dịp trải nghiệm dịch vụ này. Nếu bạn đã hoặc đang sử dụng, hãy để lại bình luận ở phía dưới bài viết nhé!

Bài viết gốc được đăng tải tại 2coffee.dev

Có thể bạn quan tâm:

Hàng loạt việc làm IT hấp dẫn trên TopDev đang chờ bạn ứng tuyển..