Node.js App on AWS EC2 Instance

To get started let’s spin up an Ubuntu 16.4 LTS instance on AWS.  After instance is up and running, we need to add port 80 to the instance’s security group inbound rules.  There should be at least two ports open: 22, and 80.

Now we can ssh into the instance and install Nginx, Node, and Supervisord.  Let’s start with Nginx.

   sudo add-apt-repository -y ppa:nginx/development
   sudo apt-get update
   sudo apt-get install -y nginx


   sudo su 
   curl --silent --location | bash -
   apt-get update
   apt-get install nodejs –y
   /usr/bin/npm install -g npm


   sudo apt-get install -y supervisor
   sudo service supervisor start

Now let’s create a Node.js server application using Express and make it listen on port 3000.

cd /var/www/html
sudo mkdir node-server
sudo chown ubuntu: node-server
sudo chmod 770 node-web-server
sudo chmod g+s node-web-server
cd node-server
npm init -y
npm install express --save
cat > app.js << EOF1
var express = require('express');
var app = express();
app.get('/', function(req, res){
   res.send('Hello Express!');
app.listen(3000, function(){
   console.log('Server is listening on port 3000');

Let’s make Supervisord “supervise” our app. Create the following file /etc/supervisor/conf.d/node-server.conf

command=/usr/bin/node /var/www/node-server/html/app.js

After that reload configuration file.

supervisorctl reread
supervisorctl update

Let’s configure Nginx to listen on port 80 and proxy all requests to port 3000 by creating the following config file /etc/nginx/sites-available/nodeserver

server {
    listen 80;
    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_http_version 1.1;
    access_log off;
    error_log  /var/log/nginx/node-server-error.log error;

Enable the site and reload Nginx.

sudo ln -s /etc/nginx/sites-available/nodeserver /etc/ngix/sites-enabled/nodeserver
sudo nginx -t
sudo service nginx reload

We should have our node application running and accessible via In order to check that add to your hosts file line that points to ip of the created AWS instance.

Resources used