Chạy process Nodejs trên production

Quản lý process Nodejs process

Việc khởi chạy server HTTP với nodejs trong quá trình phát triển khá dễ dàng. Ở đây chúng ta có một ví dụ, 1 file simple-server.js, trong file này chúng ta tạo một server có nhiệm vụ nhận query param của người dùng và in ra màn hình.

// simple-server.js
var http = require('http');
var url = require('url');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  var q = url.parse(req.url, true).query;
  var txt = q.year + " " + q.month;
  res.end(txt);
}).listen(8080);

Sau đó chúng ta khởi chạy một instance nodejs, sử dụng terminal (với Linux hoặc MacOS), hoặc command line (với Windows) với câu lệnh: node simple-server.js Lúc này chúng ta có một server tại địa chỉ http://localhost:8080/?year=2017&month=July. Nếu chúng ta tắt cửa sổ dòng lệnh đi, hoặc thoát khỏi process nodejs hiện tại bằng tổ hợp phím ctrl + c, server của chúng ta ngừng hoạt động. Nếu muốn giữ server hoạt động liên tục, chúng ta phải giữ cửa sổ dòng lệnh chạy.

Với quá trình phát triển thì ko sao, còn trên production, tất nhiên chúng ta không thể giữ nguyên cửa sổ terminal được, nhất với giao diện người dùng đơn nhiệm thông qua SSH.

Vì vậy trên server chúng ta cần phải chạy process nodejs ngầm, hay biến tiến trình nodejs thành một service (với cách gọi của Windows) hoặc Deamon (với cách gọi của linux).

Chạy nodejs như một service ngoài việc giúp chúng ta "có thể tắt terminal đi", nó còn giúp:

  • Tự khởi động lại app khi crash
  • Có được cái nhìn chi tiết về hiệu suất thời gian chạy và tài nguyên tiêu thụ.
  • Tinh chỉnh một cách linh động để cải thiện hiệu năng

Cây nhà lá vườn SystemD

System D là trình quản lý process mặc định trên Linux, cũng là một trong những công cụ đơn giản nhất để chạy nodejs như một service trên Linux.

Đầu tiên chúng ta cần tạo 1 file đặt tên là simple-node-server.service, tại /etc/systemd/system.

Giả sử file simple-server.js trước đó của chúng ta nằm ở đường dẫn /opt/nodeserver/simple-server.js, chúng ta có file simple-node-server.service như sau:

[Unit]
Description=Simple Node Server

[Service]
ExecStart=/usr/local/bin/node /opt/nodeserver/simple-server.js
# Required on some systems
#WorkingDirectory=/opt/nodeserver
Restart=always
# Restart service after 10 seconds if node service crashes
RestartSec=10
# Output to syslog
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=simple-node-server
#User=<alternate user>
#Group=<alternate group>
Environment=NODE_ENV=production PORT=1337

[Install]
WantedBy=multi-user.target

Cho phép service bằng câu lệnh: systemctl enable simple-node-server.service

Khởi động service: systemctl start simple-node-server.service

Kiểm tra xem service đã chạy chưa: systemctl status nodeserver.service

Chi tiết hơn, bạn có thể tham khảo ở đây https://www.axllent.org/docs/view/nodejs-service-with-systemd/#create-the-nodejs-server.

Sử dụng 3rd-party npm package

Forever

Đây là một gói npm với cách dùng rất đơn giản, phù hợp với ứng dụng nhỏ. Chi tiết cách sử dụng các bạn xem tại https://github.com/foreverjs/forever

PM2

Cũng tương tự chức năng như forever, tuy nhiên PM2 có sẵn cả load balancer đi kèm, giúp tải lại ứng dụng nodejs mà ko có downtime, hỗ trợ logging, giám sát (monitoring) Chi tiết cách sử dụng các bạn xem tại https://github.com/Unitech/pm2

StrongLoop Process Manager (Strong-PM)

Đầy đủ tính năng như PM2, ngoài ra Stromg PM hỗ trợ thêm multi-host deployment, hỗ trợ build, đóng gói, deploy Nodejs app ở local hoặc remote system. Chi tiết cách sử dụng các bạn xem tại http://strong-pm.io/

Tham khảo:

https://www.axllent.org/docs/view/nodejs-service-with-systemd/#create-the-nodejs-server

https://github.com/foreverjs/forever

https://github.com/Unitech/pm2

http://strong-pm.io/