Sử dụng pm2 để quản lý ứng dụng viết bằng Node.js

Sử dụng pm2 để quản lý ứng dụng viết bằng Node.js

Tin ngắn hàng ngày dành cho bạn
  • Cảm ơn threads.net của nhà Meta vì nó là nguồn cảm hứng cho mình tạo ra chuyên mục này trên blog. Ban đầu hơi nghi ngờ về việc liệu tạo ra các bài viết ngắn như thế này có thu hút được người dùng, có ai ngày qua ngày quay trở lại đọc không, hay tất cả chỉ như dã tràng xe cát? Như mình đã nói rất nhiều là làm ra một tính năng không khó, nhưng vận hành nó làm sao cho hiệu quả mới là điều cần phải bận tâm.

    Giờ đây thời gian đã chứng minh tất cả. Chuyên mục Bài viết ngắn luôn đứng trong tốp 5 trang có lượt truy cập nhiều nhất trong ngày/tuần/tháng. Điều đó có nghĩa bạn đọc đã có thói quen quay trở lại nhiều hơn. Tại sao mình lại khẳng định như thế? Vì chuyên mục này gần như không hề được SEO trên các công cụ tìm kiếm như Google.

    Lại kể về thời xa xưa một chút. Thời gian đầu mình rất chịu khó đăng bài trên threads.net với hy vọng thu hút được nhiều người theo dõi, để từ đó khéo léo giới thiệu họ trở thành người dùng blog của mình. Nhưng càng về sau càng thấy "đuối" vì thuật toán của Threads ngày càng không phù hợp với định hướng của mình. Hay nói cách khác là nội dung tạo ra không ăn khách.

    Ví dụ các bài viết của mình thường mang khuynh hướng chia sẻ thông tin, tin tức, hoặc kinh nghiệm cá nhân rút ra sau khi học hoặc làm một cái gì đó. Dường như những bài viết như vậy không được đánh giá cao và thường bị chôn vùi chỉ sau hơn... 100 lượt xem. Hmm... Liệu vấn đề có phải là do mình? Biết thế sao không chịu thay đổi nội dung theo hướng phù hợp hơn với nền tảng?

    Mình đã quan sát Threads, các nội dung dễ lan toả nhất là có yếu tố gây tranh cãi hoặc một định kiến về vấn đề gì đó, đôi khi chỉ đơn giản là phát biểu "ngây ngô" một vấn đề gì đó mà họ biết chắc chắn có tương tác. Mà mình thì gần như là không hề thích định hướng người dùng theo nội dung kiểu này. Mọi người có thể bảo mình bảo thủ, mình chấp nhận. Mỗi người có định hướng nội dung và khán giả khác nhau, lựa chọn nằm ở họ.

    Thế là từ đó mình chủ yếu viết trên này. Chỉ thi thoảng có phát hiện hay lắm thì mới lên Threads "khoe". Ở đây hàng ngày vẫn có người vào đọc, dù cho bạn là ai thì mình tin chắc rằng các bạn nhận ra được thông điệp mà mình muốn truyền tải thông qua mỗi bài viết. Ít nhất chúng ta có chung một định hướng về nội dung. Đôi khi điều sợ nhất không phải là viết ra không ai đọc, mà là họ đọc xong rồi lãng quên trong phút chốc. Số lượng là quan trọng, nhưng chất lượng mới là thứ mang chúng ta lại gần nhau hơn.

    Cảm ơn tất cả 🤓

    » Xem thêm
  • Zed chắc là cộng đồng những nhà phát triển chịu khó lắng nghe người dùng nhất quả đất. Mới đây họ thêm tuỳ chọn để tắt tất tần tật tính năng AI có trong Zed. Trong khi nhiều bên khác đang muốn tích hợp sâu hơn và làm nhiều hơn với AI Agent. Quả là một nước đi táo bạo 🤔

    You Can Now Disable All AI Features in Zed

    » Xem thêm
  • Hôm nay mình đã cố gắng đi hẳn 8k bước trong một phiên để đo lường cho các bạn thấy. Quả là không ngoài dự đoán khi thời gian đi lên đến hơn 1 giờ và quãng đường ~6km 🤓

    À vài hôm nữa là hết tháng, tức là cũng tròn 1 tháng mình bắt đầu thói quen đi bộ mỗi ngày với mục tiêu 8k bước. Để đầu tháng sau mình tổng kết lại xem thế nào luôn ha.

    » Xem thêm

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.

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.

pm2 plus

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é!

Cao cấp
Hello

Tôi & khao khát "chơi chữ"

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.

Bình luận (0)

Nội dung bình luận...