PM2: The Swiss Army knife for your Node.js app
I recently discovered PM2. It is great. Tell your friends. I can’t believe that one app does so many (necessary) things:
(Re)starts your app
A naive approach to running a Node application would be to start the process and put it in the background. But what happens when it (inevitably) crashes? Give PM2 your application configuration, and it will start the app and ensure it respawns after a crash.
Monitor memory/CPU usage
App got a memory leak? Churning CPU? Watch your usage levels in real time.
Run app in fork/cluster mode
Normally you’d have to write your app specifically to take advantage of clustering, but with PM2, you can just specify whether you want a single process or multiple processes. By default, it’ll spin up as many workers as your CPU has cores.
Log output from stdin/stderr
While there are a number of sophisticated logging solutions for Node, at this point
in my usage of it I really only care about getting console.log
statements and
stack traces written out to external files. By default, Node outputs these messages
to stdout/stderr, which PM2 will watch and write off to log files. You can easily
get a stream of logs using pm2 logs
, or limit to one application using pm2 logs <appname>
.
Easily set up log rotation
As with any web application that generates log files, after a while the files get too large and
unwieldy. PM2 has a command that will automatically generate a logrotate
config
file that targets the default PM2 log location.
Auto-restart app during development
When developing, you have to restart your Node server in order to see changes.
Frameworks like Rails have a “development” mode they can use to re-load code
before each request, but with Node you’ll probably rely on something like supervisor
,
which watches the filesystem of your project for changes, then kills/respawns
your Node process. Or you can just use PM2, which does the same thing.
Start app after server reboot
This is a necessary evil that I’d wager many developers don’t think about, similar to log rotation. Unless you create a custom init script, if your server ever reboots, you will have to log in and restart the PM2 daemon. PM2 can generate a startup script for you!
Deployment
I haven’t used this aspect of PM2, but am hoping to soon. Instead of manually SSH’ing to your server in order to do deploys, just use the functionality built in to PM2, which will check out code from your VCS and (re)start the Node process. It supports multiple server targets, as well as rollbacks.
Comments