Deploy Django Applications on Linux server

Deploy Django Applications on Linux server

Introduction

Django is a Python powered web framework that can help you get you to build powerful web applications and APIs.

In this article, I'm going to guide you through how to deploy a Django web application on any Linux server.

Prerequisites

Before we go ahead I am assuming you are already familiar with basic stuff like virtual environments, and already have a Django project setup. Moving forward we will download the rest of the dependencies and packages.

Configuration and Setup

we will start by preparing our Linux environment and virtual environment. Starting from installing pip python package manager.

sudo apt-get update
sudo apt-get install python3-pip

In this guide, we are going to be using python 3.8, with python venv module to handle our virtual environments.

sudo apt-get install python3-venv

If you don't already have a virtual environment set up, create and activate your virtual env as follows

python3 -m venv venv
source venv/bin/activate

Next, we need to set a directory that will hold out the site's static assets. this will allow Nginx to serve our static assets directly, thus improving performance. It is important to tell Django where are to look for these assets which will be our project's base directory. Add the below line to your projects settings.py

STATIC_ROOT = os.path.join(BASE_DIR, "static/")

Here,BASE_DIR is the path of our project's base directory and static is the directory to store our static assets.

Save the file. Now we need to collect all our static assets that you might have used in the project to this directory. Fortunately, Django provides us with a single command to achieve this.

python manage.py collectstatic

If asked type "yes" to confirm the action. Now is the right time to check if everything is working as intended. So, fire up the server and run tests if any.

python manage.py runserver

if you have unit test setup then,

python manage.py test

Setting uWSGI Server

Django development server nice during development but when using our application in real-world we need to have something more reliable and secure. Hence uWSGI Server. In order to use uWSGI in our system, we need some dependencies and development files.

sudo apt-get install python-dev
pip3 install uwsgi

we can quickly check our server by passing information of our application.

uwsgi -http :8080 --home /home/user/venv --chdir /home/user/myproject -w myproject.wsgi

change /home/user/venv with the path of your virtual environment, /home/user/myproject with the path of your project, and myproject.wsgi with your project's wsgi file.

what's going on here you ask? here we have told uwsgi to first change to our home directory then use our virtual environment for anything ahead. Change to our project directory and use our project uwsgi python file.

When you run the service and goto /admin of your project, you will notice though the functionality is working but CSS is not. In order to do so, we need to create our custom configuration files.

Start by creating a directory to store your configuration files.

sudo mkdir  -p /etc/uwsgi/sites
cd /etc/uwsgi/sites

in the sites directory we will place our configuration files. Create a myproject.ini configuration file

sudo nano myproject.ini

in the myprojct.ini files we will add the following content

[uwsgi]
project = myproject
base = /home/user

chdir = %(base)/%(project)
home = %(base)/venv
module = %(project).wsgi:application

master = true
processes = 5

socket = %(base)/%(project)/%(project).sock
chmod-socket = 664
vacuum = true

here, myproject needs to replaced with your project name, /home/user with path of your project's path. With this our configuration is almost complete. I'm not getting in deep about what this all really means for now. But provide enough reference at the end if you are intrested. Though we now have a configuration to serve our application but we haven't really automated the process to restart the server once we reboot the server. Thus we need an upstart script.

sudo nano /etc/init/uwsgi.conf

In the editor enter the following

description "uWSGI application server in Emperor mode"

start on runlevel [2345]
stop on runlevel [!2345]

setuid user
setgid www-data

exec /usr/local/bin/uwsgi --emperor /etc/uwsgi/sites

Install and configure Nginx as a Reverse Proxy

With uWSGI configured and ready to go, we can now install and configure Nginx as our reverse proxy. This can be downloaded from Ubuntu’s default repositories:

sudo apt-get install nginx

now create a server block configuration file:

sudo nano /etc/nginx/sites-available/myproject

we can start our server block by indicating the port number and IP address where our first project should be accessible.

server {
    listen 80;
    server_name 123.456.789 456.789.123;
}
location /static/ {
        root /home/user/myproject;
}
location / {
        include         uwsgi_params;
        uwsgi_pass      unix:/home/user/myproject/myproject.sock;
    }
}

save and close the file when you are finished. Now we need to link our new configuration files to Nginx's sites-enabled directory to enable them.

sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled

check the syntax by typing

sudo service nginx configtest

If no syntax errors are detected, you can restart your nginx service to load the new configuration.

sudo service nginx start

You should now be able to reach your project by going to IP address. With everything working fine.