Steps to deploy a Node.js app to AWS EC2 using PM2, NGINX as a reverse proxy and an SSL from LetsEncrypt
Create a new EC2 instance or use an existing one. Connect to the instance via SSH.
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt install nodejs
make sure node.js and npm are installed
node -v
npm -v
git clone yourproject.git
or setup github action for your project to send production ready code to the AWS instance
cd <yourApp>
npm install
npm start
# stop app
ctrl+C
sudo npm i pm2 -g
pm2 start <app.js>
# Other pm2 commands [optional]
pm2 show app
pm2 status
pm2 restart app
pm2 stop app
pm2 logs (Show log stream)
pm2 flush (Clear logs)
# To make sure app starts when reboot
pm2 startup ubuntu
You should now be able to access your app using your IP and port. Now we want to setup a firewall blocking that port and setup NGINX as a reverse proxy so we can access it directly using port 80 (http)
sudo ufw enable
sudo ufw status
# Port 22
sudo ufw allow ssh
# Port 80
sudo ufw allow http
# Port 443
sudo ufw allow https
sudo apt install nginx
sudo nano /etc/nginx/sites-available/default
Add the following to the location part of the server block
# if you will use domain name
server_name yourdomain.com www.yourdomain.com;
location / {
# pay attention to the port
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
# Check NGINX config
sudo nginx -t
# Restart NGINX
sudo service nginx restart
You should now be able to visit your IP with no port (port 80) and see your app. Now let's add a domain
please follow the instructions: https://certbot.eff.org/instructions?ws=nginx&os=ubuntufocal
Now visit https://yourdomain.com / https://ip_address and you should see your Node app