Building a Scalable Django Application with Gunicorn and Nginx

  • Scaling your web app is essential for success.
  • Django is great, but Gunicorn and Nginx are needed for true scalability.
  • This post shows you how to build a scalable Django app with Gunicorn and Nginx.
  • This post follows in “Kali Linux”. You can use any Linux based OS.

Introduction:

  • Building a web application that can handle a growing number of users and requests is crucial for any successful project.
  • Django, a powerful Python framework, provides a solid foundation, but for true scalability, you need to leverage the power of tools like Gunicorn and Nginx.
  • This post will guide you through the process of setting up a scalable Django application using Gunicorn and Nginx, ensuring your website can handle the demands of a growing user base.

⚙️ Setting up –

  • I am doing this in Linux.
  • First check python3, pip, nginx Installed or not.
  • To install use this command (install in home/Desktop or new terminal)
sudo apt install python3 python3-pip nginx 
Enter fullscreen mode
Exit fullscreen mode
  • Now create a Virtual environment (create new folder 📂 for this)
  • Activate the environment
source environment_name/bin/activate # use name created above "environment_name"
Enter fullscreen mode
Exit fullscreen mode
  • Now Install packages 📦 in environment
    • django, gunicorn
pip install django
pip install gunicorn // or directly install both
pip install django gunicorn
Enter fullscreen mode
Exit fullscreen mode

Creating Django Project

  • Use this command to create Django project
django-admin startproject myproject # use any name "myproject"
Enter fullscreen mode
Exit fullscreen mode

Create a Gunicorn Configuration File

  • Use this command
nano gunicorn_conf.py # use any name but using same better "gunicorn_conf.py"
Enter fullscreen mode
Exit fullscreen mode
  • Add the following code in “gunicorn_config.py”
import multiprocessing bind = '127.0.0.1:8000' # Django running port/link
workers = multiprocessing.cpu_count() * 2 + 1
Enter fullscreen mode
Exit fullscreen mode
  • Save file using “CTRL + o”(to save), press ENTER, “CTRL + X”(to exit)
  • This will create workers and also we should add our Django running link.
    ### Run the Django project/application with gunicorn
  • First navigate to project folder
cd myproject # navigate to Django Project "myproject"
Enter fullscreen mode
Exit fullscreen mode
  • Now run this command
gunicorn myapp.wsgi:application -c ../gunicorn_conf.py # here myapp is myproject # here "myapp" is a Django project name, and at last gunicorn_conf.py is a gunicorn configuration file which created above/before.
Enter fullscreen mode
Exit fullscreen mode
  • Now make some changes in Django project
  • First change some code in settings.py in project folder. Directory myproject/myproject/settings.py > Django project
  • For this use any code editor like VS Code. To open from terminal use this command
code- oss # to open vs code from terminal
Enter fullscreen mode
Exit fullscreen mode
  • Add this code
# example code
ALLOWED_HOSTS = ['localhost', '0.0.0.0', '127.0.0.1'] # use IP address here
Enter fullscreen mode
Exit fullscreen mode
  • In above command we used IP address, to get that open another new terminal and run this command to get all about network.
ifconfig
Enter fullscreen mode
Exit fullscreen mode

Create a Nginx Configuration File

  • Open another new terminal, run this command
sudo nano /etc/nginx/sites-available/myapp # use any name "myapp" # better use vs code instead of nano
sudo code- oss /etc/nginx/sites-available/myapp # check code-oss
Enter fullscreen mode
Exit fullscreen mode
  • Add code in that nginx file
server { listen 80; server_name your_domain.com; # Replace with your domain or IP address # example for aboveline: server_name 'ipaddress' 'another domain' ; location / { proxy_pass http://127.0.0.1:8000; # Gunicorn's default address proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
}
Enter fullscreen mode
Exit fullscreen mode
  • save the file
  • create a Symbolic Link to enable Nginx Configuration, run this command
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled # change "myapp" to nginx config file name used above
Enter fullscreen mode
Exit fullscreen mode
  • That’s it.
    ## Testing:
  • First check Nginx configuration file for any syntax error.
sudo nginx -t
Enter fullscreen mode
Exit fullscreen mode
  • If you don’t have any errors, first restart the Nginx using this command
sudo systemctl restart nginx
Enter fullscreen mode
Exit fullscreen mode

Setting up Firewall for Nginx

  • Open new terminal, and install this package
sudo apt install ufw
Enter fullscreen mode
Exit fullscreen mode
  • Now allow Nginx through Firewall
sudo ufw allow 'Nginx Full'
Enter fullscreen mode
Exit fullscreen mode

Using Instructions –

  • First start Nginx by opening new terminal
sudo systemctl start nginx
Enter fullscreen mode
Exit fullscreen mode
  • Now to start complete project open a terminal and go to virtualenv created and activate
gunicorn myapp.wsgi:application -c ../gunicorn_conf.py # in above code "myapp" is a Django project name
# last gunicorn_conf.py is a gunicorn configuration file name
Enter fullscreen mode
Exit fullscreen mode
  • Now the complete project started.
  • Now you can open your django project with your IP address.
  • Navigate to browser and search with your IP address.
  • To stop Nginx, use this command
sudo systemctl stop nginx
Enter fullscreen mode
Exit fullscreen mode

Happy Coding 😴 – Be Lazy

Contact DM – Twitter(X)
Contact Mail – [email protected]


Discover more from Coursity

Subscribe to get the latest posts sent to your email.

Leave a Comment

Your email address will not be published. Required fields are marked *

Discover more from Coursity

Subscribe now to keep reading and get access to the full archive.

Continue reading

Scroll to Top