How to setup a simple nodejs app with nginx and pm2 on ubuntu server
Running nodejs app on the the development or local environment where GUI interface is provided in OS is easy task but when it comes to deploy it in production on cloud server, most of the beginners doesn't know how to start. So, here is the detailed step by step procedure for setting up a simple nodejs app.
1. Creating a new sudo user
NOTE: If you've already created a user with superuser privileges then you didn't need to follow this step.
Actually you can directly work with root
user but then some dangerous commands mistyped by you in the terminal will cause harm to the server. So better go with sudo
access and to create it first login with root
user privileges:
$ ssh root@your_server_ip
And then complete it by giving password and host authenticity. Now create a new user with sudo
access:
$ adduser sonu
$ usermod -aG sudo sonu
The first command create a new user after asking some questions and the second command add that user to the sudo
group (superuser group). Now logout from the server (use exit
command) and login with this new user.
$ ssh sonu@server_ip
2. Install the nginx and node.js
First update the apt
repository with this command:
$ sudo apt update
Now install nginx using
$ sudo apt install nginx
And then nodejs
with
$ curl -sL https://deb.nodesource.com/setup_6.x | bash
$ sudo apt install -y nodejs
You can also checkout the official nodesource [installation instructions.] (https://github.com/nodesource/distributions#installation-instructions) for latest node.js version.
3. Starting a simple nodejs (express) app
We will create a simple expressjs app using express-generator
. So first install express-generator
globally using the following:
$ sudo npm i express-generator -g
After that create the express app in the home directory
$ cd ~
$ express testapp
Now start the app using :
$ cd testapp
$ npm install & npm start
Your app will start at http://localhost:8080
port.
4. Install pm2 to run it forever
Simply do npm start
will not restart the app if the app goes down incase of server failure or something. So to keep it up and running every time system restart, we use pm2
nodejs app. Install it globally by typing sudo npm i pm2 -g
and run the app forever using the following command.
$ cd testapp/bin
$ pm2 start www
5. Mapping 8080 to default http port.
Now the final step is to use nginx to map 8080
port to default 80
http port. We call it reverse proxy server. Open the default server block of nginx and delete everything from that file.
$ sudo nano /etc/nginx/sites-available/default
Paste the following code into this file and save it:
server {
listen 80;
server_name "";
location / {
proxy_pass http://localhost:8080;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Finally test the configuration and reload the nginx :
$ sudo nginx -t
$ sudo nginx -s reload
## or restart the nginx
$ sudo service nginx restart
Additional step is to disable port 8080
through ubuntu ufw
firewall. Enabling it will block all the ports. So allow some common ports through Nginx Full
configuration.
$ sudo ufw enable
$ sudo ufw allow 'Nginx Full'