Deploy Django project on AWS with Apache2 and mod_wsgi module.

Author: neptune | 25th-May-2023
#Python #Django

Steps to Deploy Django App

In this blog, I use the AWS Ubuntu 18.22 instance as a Hosting platform and used an Apache2 server with mod_wsgi for configurations.

Step 1. Run these below cmd's to get the latest updates.

$ sudo apt-get update

$ sudo apt-get upgrade

$ sudo apt-get install -y python3-pip

$ sudo python3 -m pip install --upgrade pip

Step2. Now let's make a new directory for our project.

$ mkdir /var/www

Move into the directory:

$ cd /var/www

Step 3. Now, Create a quick project or Import or clone an existing django project.

I will prefer to create a small project and then import or clone your existing project to make sure other things are working as expected.

Check that the Python is installed 

$ python3 --version

$ sudo python3 -m pip install django


$ sudo python3 -m pip uninstall django==2.2

Check the Django version.

$ python3 -m django --version

Create a project using django admin.

$ sudo django-admin startproject mysite

Change directory into that project:

$ cd mysite/

Create an app using 

$ sudo python3 startapp website

Migrate the changes to create db instances.

$ sudo python3 migrate

If you face any issue in migration run the below cmd:

$ sudo python3 migrate --run-syncdb

Run the django server.

$ sudo python3 runserver

Step 4. Now install apache2 and mod_wsgi for Python3.

$ sudo apt-get install -y apache2 libapache2-mod-wsgi-py3

Now let's setup the apache config file for our website:

$ sudo nano /etc/apache2/sites-available/mysite.conf


<VirtualHost *:80>


ErrorLog ${APACHE_LOG_DIR}/mysite-error.log 

CustomLog ${APACHE_LOG_DIR)/mysite-access.log combined

WSGIDaemonProcess mysite processes=2 threads=25 python-path=/var/www/mysite 

WSGIProcessGroup mysite

WSGIScriptAlias / /var/www/mysite/mysite/ 

Alias /robots.txt /var/www/mysite/static/robots.txt

Alias /favicon.ico /var/www/mysite/static/favicon.ico

Alias /static/ /var/www/mysite/static/

Alias /static/ /var/www/mysite/media/

<Directory /var/www/mysite/mysite>


      Require all granted



<Directory /var/www/mysite/static> 

   Require all granted 


<Directory /var/www/mysite/media>

    Require all granted



<Directory /var/www/mysite>

        WSGIApplicationGroup %{GLOBAL}

        Order deny,allow

        Allow from all


ServerName, WSGIProcessGroup and also change Directory as per the project.


Remove the default site if you wish to remove it.

$ sudo rm /etc/apache2/sites-available/000-default.conf

Now enable our new site “mysite.conf” and reload the Apache server.

$ sudo a2ensite mysite

$ sudo systemctl reload apache2

Check the status using below cmd.

$ sudo systemctl status apache2.service

Finally, we can try the url or IP that we configured in “mysite.conf” in ServerName. 

Example: ServerName

But we find that we can't access the Images and not able to login to application because our database is read-only for our user.

In this case, using apache, our "user" is www-data. We need to give this user permission to edit these files for us. 

$ cd /var/www/

$ sudo chown www-data mysite/

$ sudo chown www-data mysite/db.sqlite3

$ sudo chown www-data mysite/*

$ sudo chown www-data mysite/media/*

$ sudo chown www-data mysite/static/*

Then reload server:

$ sudo service apache2 reload 


$ sudo systemctl reload apache2

You can check the users using:

$ ls -l

You can check the status of your apache server:

$ sudo systemctl status apache2.service

To start or stop apache service use below cmds:

$sudo systemctl start apache2.service

$sudo systemctl stop apache2.service

After successful run now you can import your existing project.

$ sudo git clone

Then install all the required applications like:

$ sudo pip install django-taggit==1.3.0

$ sudo pip install django-crispy-forms==1.10.0

$ sudo pip install django-summernote==

$ sudo apt install Pillow==8.1.0

Run this cmd to get all the static files in a path that you configured in so that django can use them.

$ sudo python3 collectstatic

To check the logs use below cmds:

$ cd /var/log/apache2

Move to the directory or directly access using below nano cmd:

$ sudo nano /var/log/apache2/mysite-error.log

$ sudo nano /var/log/apache2/mysite-access.log

Thanks for Reading !!!

anonymous | Nov. 30, 2022, 1:20 a.m.

This helped me lot 👍

anonymous | July 17, 2022, 5:43 p.m.


anonymous | May 13, 2022, 4:22 p.m.

I was looking Apache2 and Flask but this also worked

Related Blogs
How to extract Speech from Video using Python?
Author: neptune | 16th-Jun-2023
#Python #Projects
Simple and easy way to convert video into audio then text using Google Speech Recognition API...

How to download video from youtube using python module ?
Author: neptune | 15th-Jun-2023
We will let you know how you can easily download the Youtube high quality videos along with subtitle, thumbnail, description using python package..

Best Python package manager and package for virtual environment ?
Author: neptune | 18th-Jun-2023
#Python #Pip
We will explore the options of Pip, Virtualenv, Anaconda, and also introduce Pyenv as a helpful tool...

Mostly asked Python Interview Questions - 2023.
Author: neptune | 30th-May-2023
#Python #Interview
Python interview questions for freshers. These questions asked in 2022 Python interviews...

How to reverse string in Python ?
Author: neptune | 16th-May-2022
We are going to explore different ways to reverse string in Python...

Python Built-in functions lambda, map, filter, reduce.
Author: neptune | 15th-Jun-2023
We are going to explore in deep some important Python build-in functions lambda, map, filter and reduce with examples...

Core Python Syllabus for Interviews
Author: neptune | 26th-Jul-2023
#Python #Interview
STRING MANIPULATION : Introduction to Python String, Accessing Individual Elements, String Operators, String Slices, String Functions and Methods...

Python 3.9 new amazing features ?
Author: neptune | 26th-Jul-2023
Python 3.9 introduces new features such as dictionary union, string methods to remove prefixes and suffixes, type hinting, and speed improvements for built-in functions...

Opportunities - React Django Developer
Author: neptune | 14th-Apr-2023
#React.js #Django
React Django stack is popular for building web applications. Opportunities for React Django developers in Full Stack, Web, and Software development roles...

Input and Output in Python
Author: neptune | 13th-Jul-2023
In this article, we will see how Python take input from user and How it display the output to user. First we cover input then output...

5 Best Python Testing Frameworks.
Author: neptune | 12th-Apr-2023
#Python #Testing
Python offers various testing frameworks, including Pytest, unittest, Nose, Robot Framework, and Behave, to build robust and reliable software...

5 Languages that Replace Python with Proof
Author: neptune | 13th-Apr-2023
Julia, Rust, Go, Kotlin, and TypeScript are modern languages that could replace Python for specific use cases...

Boosting django app performance with Custom Context Processors
Author: neptune | 17th-May-2023
Learn how to create and use custom context processors in Django to add dynamic variables to your templates and enhance user experience...

10 Proven Ways to Earn Money Through Python
Author: neptune | 11th-Apr-2023
Python offers numerous earning opportunities from web development to teaching, data analysis, machine learning, automation, web scraping, and more...

Monkey Patching in Python: A Powerful Yet Controversial Technique
Author: neptune | 01st-Aug-2023
Monkey patching in Python is a dynamic technique to modify code at runtime. It can add/alter behavior, but use it judiciously to avoid maintainability issues...

View More