DEV Community

Cover image for Building a Scalable Django Application with Gunicorn and Nginx
Sanya_Lazy
Sanya_Lazy

Posted on

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 - sanya.san@myyahoo.com

Top comments (0)