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 https://deb.nodesource.com/setup_8.x -o nodejs.sh // Prepare repos and settings sudo bash nodejs.sh // 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; server_name mydomain.com; 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 mydomain.com; proxy_read_timeout 2m; proxy_connect_timeout 2m; // Node app port proxy_pass http://127.0.0.1:8080; } }
And it’s all. With that you can run Node.js app in background and in production.