How to Deploy Django with Nginx Gunicorn and Supervisor on Ubuntu 22.04

January 07, 2023 ・0 comments

Learn how to deploy a Django application with Nginx, Gunicorn, and Supervisor on Ubuntu 22.04. Get step-by-step instructions for setting up a secure, reliable web server using best practices that will help you keep your web application.

Django with Nginx Gunicorn and Supervisor on Ubuntu 22.04

Create Separate User and Group

sudo groupadd --system project-group

Add New User

sudo useradd --system --gid project-group --shell /bin/bash --home/projectroot project-user 

Create a Root Folder for the project

mkdir ~/projectroot
cd ~/projectroot

Then create a virtual environment for the Project

virtualenv app1

Go to the environment folder and activate the virtual environment

cd app1
source bin/activate

Create the requirements.txt file for the Django or flask project

sudo vi requirements.txt

Add the packages then save the file.

Create a log folder in the environment folder

mkdir logs

Now clone the Django or flask project from the GitHub repository

git clone url.git

change the ownership permission for the project and other files

sudo chown -R project-user:project-group .

Create a gunicorn script in bin folder

sudo vi bin/gunicorn_start

Paste the below script into the file

#!/bin/sh

NAME='Project Name'
DJANGODIR=/projectroot/app1/django_project
SOCKFILE=/projectroot/app1/run/gunicorn.sock
USER=project-group
GROUP=project-user
NUM_WORKERS=3
DJANGO_SETTINGS_MODULE=django_project.settingsprod
DJANGO_WSGI_MODULE=django_project.wsgi
TIMEOUT=120

cd $DJANGODIR
source ../bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH

RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

exec ../bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
  --name $NAME \
  --workers $NUM_WORKERS \
  --timeout $TIMEOUT \
  --user=$USER --group=$GROUP \
  --bind=unix:$SOCKFILE \
  --log-level=debug \
  --log-file=-

then make this file Executable

chmod +x bin/gunicorn_start

Now install the Supervisor

sudo apt install supervisor

Create a new config file in the supervisor

sudo vi /etc/supervisor/conf.d/django_project.conf

then add the below script and save

[program:django_project]
command = /projectroot/app1/bin/gunicorn_start
user = project-user
stdout_logfile = /projectroot/app1/logs/supervisor.log
redirect_stderr = true
environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8
supervisorctl reread
supervisorctl update
supervisorctl status

Now create the nginx configaration for the project

sudo vi /etc/nginx/sites-available/django_project.conf

paste the below configaration.

upstream django_project_app_server {
server unix:/saulroot/saul_3_6_4/run/gunicorn.sock fail_timeout=0;
}

server {
listen 80;
server_name example.com;
access_log /projectroot/app1/logs/nginx-access.log;
error_log /projectroot/app1/logs/nginx-error.log;

location /static/ {
alias /projectroot/app1/django_project/static/;
}

location /media/ {
alias /projectroot/app1/django_project/media/;
}

location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header Host $http_host;

proxy_redirect off;

if (!-f $request_filename) {
proxy_pass http://django_project_app_server;
}
}
}

Restart Nginx

sudo nginx -t
sudo systemctl restart nginx

open the browser http://example.com

Post a Comment

If you can't commemt, try using Chrome instead.