Dạo này tôi làm mấy app Node.js và tôi rất cần một cách “tử tế” để nó tự khởi động cùng với server. Sau nhiều lần thử những cách “ngu học” như biến app Node.js thành một service hay chạy một lệnh khi khởi động thì tôi cũng tìm ra PM2. Cái này chắc các bạn làm Node.js từ trước chắc biết cả rồi, còn tôi thì giờ mới biết, vớ được PM2 như bắt được vàng :))

Cài đặt PM2

PM2 là một Node package, nhưng bạn không nên khai báo ở package.json mà chỉ nên cài riêng khi cần thiết:

Việc thêm app vào process list của pm2 cũng rất đơn giản:

Với một app Node.js & Express thông thường thì start bin/www thay vì app.js nhé.

Màn hình lệnh khi thêm app vào pm2 processes list

Từ giờ PM2 sẽ chạy và tự khởi động lại app nếu nó die. Dễ quá nhỉ.

Khởi động PM2 service cùng Server

Để PM2 tự khởi động app khi server khởi động thì phải làm thêm một bước nữa, may thay bước này rất đơn giản vì pm2 sẽ tự động detect OS bạn đang xài là gì và generate ra command cho bạn chạy luôn:

Giờ bạn chỉ cần copy/paste và chạy dòng thứ 3 của đoạn text vừa sinh ra là PM2 sẽ tự khởi động cùng với server rồi. Cách này sẽ work với các Linux Distributions và MacOS nhé. Còn Windows thì PM2 chưa hỗ trợ hoàn toàn và phải config thêm một số bước nữa (ai xài Windows tự tìm hiểu nhé hô hô).

Kết quả của lệnh pm2 startup khi chạy trên Ubuntu 18.04

Có một cách đơn giản hơn đó là bắt lấy dòng thứ 3 của lệnh pm2 startupvà lưu ra một file .sh, sau đó execute file này. Do tôi rất lười nên đã rút gọn các bước trên thành 1 lệnh:

Khắc phục lỗi với Vagrant

Tôi có một dự án dở hơi chạy trên Vagrant và trong box đó có 2 phần là Laravel và Node.js. Mặc dù dở hơi như vậy nhưng nó vẫn chạy tốt và tôi cần config để PM2 khởi động cùng với vagrant up.

Vấn đề là khi Vagrant khởi động thì thư mục code chưa kịp mount vào trong máy ảo, dẫn đến việc PM2 không tìm thấy file cần chạy. Vì vậy app sẽ không khởi động cùng với Vagrant như mong đợi.

Rất may là vẫn có cách khắc phục bằng cách bắt Vagrant chạy một lệnh sau khi nó đã mount thư mục code. Chỉ cần thêm dòng dưới vào vị trí thích hợp trong Vagrantfile, ví dụ:

Nhớ thay /vagrant/project/server/index.js bằng đường dẫn tuyệt đối đếnapp.js hoặc bin/www trong project nhé.

Những lệnh hay dùng với PM2

Nếu chạy start app.js thì process name sẽ tự động gán thành app.js. Tương tự nếu chạy start bin/www thì process name là www. Để stop các process thì ta dùng lệnh sau:

Nếu nhiều process có cùng tên file thì ta cần set name riêng cho từng process để tránh bị trùng:

Sau đó stop bằng name đã set:

Xem danh sách các process:

Khởi động lại process:

Xóa process:

 

Tham khảo: