Deploy Next.js App on AWS EC2 With SSL & Custom Domain

Create EC2 Instance & Connect

Launch EC2 with Key Pair

ssh command requires .pem permission
chmod 400 your-key.pem
ssh -i your-key.pem ubuntu@YOUR_EC2_PUBLIC_IP

Install Node & Git

Download Node.js 20

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs git

Clone Your Project

Pull project from GitHub

git clone https://github.com/yourusername/your-nextjs-project.git
cd your-nextjs-project

Install Dependencies & Add Environment Variables

Install node modules

npm install

Add .env file

nano .env

Build Next.js app

npm run build

Run App Using PM2

Install PM2 globally

sudo npm install pm2 -g

Start Next.js production server

pm2 start "npm start -- -H 0.0.0.0" --name "App name"

Save PM2 state

pm2 save

Enable auto-start on reboot

pm2 startup

Install & Configure NGINX

Install nginx

sudo apt install nginx -y

Edit NGINX default config

sudo nano /etc/nginx/sites-available/default

Clear existing file

sudo truncate -s 0 /etc/nginx/sites-available/default

Add this config

sudo systemctl reload nginx

Add SSL Certificate (HTTPS)

Install Snap & Certbot

sudo apt update
sudo apt install snapd -y
sudo snap install core
sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

Configure Domain Before SSL

Add domain to nginx

sudo nano /etc/nginx/sites-available/default
Add your domain/server_name
sudo systemctl reload nginx

Generate Free SSL

sudo certbot --nginx -d "your-domain-or-sub-domain"