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
Node.js
sudo su
curl --silent --location https://deb.nodesource.com/setup_8.x | bash -
apt-get update
apt-get install nodejs –y
/usr/bin/npm install -g npm
exit
Supervisord
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');
});
EOF1
Let’s make Supervisord “supervise” our app. Create the following file /etc/supervisor/conf.d/node-server.conf
[program:nodeserver]
command=/usr/bin/node /var/www/node-server/html/app.js
directory=/var/www/html/node-server
autostart=true
autorestart=true
startretries=3
user=ubuntu
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;
server_name node-server.com;
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;
proxy_pass http://127.0.0.1:3000;
}
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 node-server.com In order to check that add to your hosts file line that points node-server.com to ip of the created AWS instance.