Deploy Django Application on AWS EC2 instance with Nginx and Gunicorn and connect to RDS (Ubuntu Server 20.04 LTS)

Aditya Mali
4 min readJan 1, 2021

--

Creating a new EC2 instance

After creating the account on AWS as you log into your console you will find EC2 under All services in compute section, so select it.

Now you will be able to see instances(running) under Resources it will state as 0 if you have not launched any instance yet.

So select launch instance, and then select Ubuntu Server 20.04 LTS

Choose an Instance Type and click on Review and Launch now click on launch and create a new key pair and keep it safe as the private key allows you to securely SSH into your instance.

Wait for a few minutes your instance will be live and running.

To connect to your instance follow following steps

Step 1: Open a new terminal, cd into where you have stored your serverkey.pem file.

Step 2: Run this command, if necessary, to ensure your key is not publicly viewable

chmod 400 Your_serverkey_name.pem

Step3: Click on your instance, then click on connect, and select SSH client you will find the command as below copy it and paste in your terminal

ssh -i "serverkey.pem" ubuntu@ec2-100-25-141-73.compute-1.amazonaws.com

Setting up your newly created instance for your Django Application.

Step 1: Install Nginx server on your instance

sudo apt install nginx

Step 2: Create a new directory give it name whatever want

mkdir aditya && cd aditya

Step 3: To install pip and virtualenv run following commands

Sudo apt update
sudo apt install python3-pip
sudo apt install python3-virtualenv

Step 4: Create a virtual environment and activate it.

virtualenv venv
source venv/bin/activate

Step 5: Clone your project from GitHub

git clone https://github/your_project_link

Step 6: Install your requirements if any

pip install -r requirements.txt

Step 7: Install Gunicorn

sudo apt install gunicorn

Step 8: Click on the link in security groups from the security tab

Step 9: Now in Inbound rules click on Edit inbound rules and Add rule now add port 80 and port 9090 as below

and then click on the save rule.

Step 10: Now cd into your project directory and open settings.py file and in allowed hosts list append your public IP address as below

ALLOWED_HOSTS = ['100.25.141.73','0.0.0.0']

Step 11: Open new terminal and SSH into your instance using your serverkey.pem and enter below commands

cd /etc/nginx/sites-enabled
sudo vi default

Step 12: Now replace location /{ …. } as below and save and exit form vi editor

location /{   proxy_pass http://0.0.0.0:9090;  }

Step 13: Now start nginx server using below command

sudo systemctl start nginx

Step14: Return to your previous terminal and cd into your project directory where your wsgi file is located and run the following command.

gunicorn --bind 0.0.0.0:9090 wsgi

You have deployed your Django application on Amazon EC2 instance enter your on your public IP adress in browser and you web app will be live and running

Connecting Django Application to RDS (MySQL)

Step1: Select RDS from All Services under Database section and then click on create database button

Step 2: Select MySQL then Enter your credentials and remember them and click on create database

Step 3: Your database will be created now click on your database and copy your and endpoint from Connectivity & security

Step 4: Now Open new terminal SSH into your EC2 instance activate your virtual environment and enter the following commands

sudo apt-get install python3-dev default-libmysqlclient-dev build-essentialpip3 install mysqlclientsudo apt install mysql-server

Step 5:Now executed following command to connect to your RDS and enter your password.

mysql -u YOUR USERNAME -p -h  YOUR_RDS_ENDPOINT.rds.amazonaws.com

Step 6: Create a new database and exit

mysql> create database mydb;
mysql> quit;

Step 7: Edit your database settings in your projects settings.py file as below and replace with your credentials

DATABASES = {              'default':{   'ENGINE': 'django.db.backends.mysql',                            'NAME': 'mydb',                            'USER': 'YOUR_MASTER_USERNAME',                            'PASSWORD': 'YOUR_MASTER_PASSWORD',                            'HOST':'YOUR_RDS_ENDPOINT',                            'PORT': 3306,                            'OPTIONS': {                                         'sql_mode': 'traditional',                                       }                         }}

Step 8: Now run makemigrations and migrate

python3 manage.py makemigrations
python3 manage.py migrate

Step 9: Restart your gunicorn server

pkill gunicorn
gunicorn --bind 0.0.0.0:9090 project_name.wsgi

--

--