Run Node.js app on Ubuntu Server using pm2

I work with Node.js and some other JavaScript technologies in last months. One important think is – how run ready application on production server? It wasn’t easy question, because earlier I used only development mode in IDE (with automatic rebuild and generation in background). After some research I found pm2 – great package to run Node.js application in background. With that manager we can start, stop or restart many applications. Let’s see how we can easily run Node.js app.

I based on Ubuntu Server, becuase I think it’s good option and with a lot of packages. First, we must install pm2. It’s available in npm – we must first install nodejs on Ubuntu. All required repositories are available in special Node.js PPA script:

// Install package required by some npm
sudo apt-get install build-essential

// Download node
curl -sL -o

// Prepare repos and settings
sudo bash

// Run Node.js
sudo apt-get install nodejs

Then we can install pm2 using npm:

sudo npm install -g pm2

And it’s all. We can now use pm2 to run Node.js apps:

// Start app
pm2 start myapp.js

// Restart
pm2 restart myapp

// Stop
pm2 stop myapp

// List all saved apps
pm2 list

It’s also a good option to add pm2 to startup:

pm2 startup systemd

Last step is to prepare Nginx virtual host for Node.js app. I created Nginx posts series, but about PHP. In this case we will use Node.js and it works in similar way – we just “redirect” requests from Nginx to localhost Node.js app. Nginx will be a proxy server between user and real app. Why not only Node.js? Because with Nginx, we can avoid use root privilages for port 80/443 for Node app. Also Nginx is much faster for static content. It’s a example virtual host config:

server {
    root /var/www;

    index index.html index.htm index.nginx-debian.html;

    gzip            on;
    gzip_types      text/plain application/xml text/css application/javascript;
    gzip_min_length 1000;

    location / {
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cookie_domain localhost;
        proxy_read_timeout 2m;
        proxy_connect_timeout 2m;

        // Node app port

And it’s all. With that you can run Node.js app in background and in production.

Notify of

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Inline Feedbacks
View all comments