Deploy a Django Project with Apache Server

Author Avatar
Nathaniel Oct 14, 2016

Note: This guide is intended for Ubuntu 16.04

Project Directory

First of all, let’s make sure the django project is structured like this:

.
├── my-site-virtualenv/
|   ├── pip-selfcheck.json
|   ├── bin/
|   ├── ...
|   └── my-site-repository/
|       ├── .git/
|       ├── requirements.txt
|       ├── README.md
|       ├── app1/
|       |   ├── models.py
|       |   ├── views.py
|       |   ├── ...
|       ├── my_site/
|       |   ├── settings.py
|       |   ├── wsgi.py
|       |   ├── ...
└── another-project/

Django

Settings

Make sure the Django project is connected to a MySQL server, and has the following line in settings.py

STATIC_ROOT = os.path.abspath('/var/www/[my-project]/static/')

WSGI

Add the following to wsgi.py:

import sys

sys.path.append('/[path-to-my-project-vir]/my-project-repo')
sys.path.append('/[path-to-my-project-vir]/lib/python3.5/site-packages')

Virtualenv, Git Clone and Install

$ virtualenv my-project-vir
$ cd my-project-vir
$ mkdir my-project-repo
$ cd my-project-repo
$ git clone [git-repo-address] .
$ pip install -r requirements.txt

See “Django - Connect to Remote MySQL Database” about how to install mysqlclient

Collect Static Files

$ python manage.py collectstatic

Change Owner

$ sudo chown -R :www-data /var/www/[my-project]

Apache2

Install

$ sudo apt-get install apache2-dev libapache2-mod-wsgi apache2

Config

Append the following to /etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
    . . .

    Alias /static /var/www/[my-project]/static

    <Directory /[path-to-my-project-repo]/[my-project]>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>

    WSGIDaemonProcess my-project python-path=[path-to-my-project-repo]:[path-to-my-project-vir]/lib/pythonx.x/site-packages
    WSGIProcessGroup my-project
    WSGIScriptAlias / [path-to-my-project-repo]/[my-project]/wsgi.py
    WSGIPassAuthorization On

</VirtualHost>

mod_wsgi

Download Source

Go to https://github.com/GrahamDumpleton/mod_wsgi/releases and find the latest release .tar file.

$ cd ~/
$ wget <url-to-.tar-file>

Unpack .tar file:

$ tar xvfz <.tar-file-name>

Build

cd into source directory, then

$ ./configure --with-python=<path-to-virtualenv>/bin/python3

Build:

$ make

Back to Apache2

Modify Apache2 Config

Find any mod_wsgi.so, and copy the path:

$ sudo find / -name "mod_wsgi.so"

By default, it should be at /usr/lib/apache2/modules/mod_wsgi.so

Then, find the main Apache2 configuration file. By default, it should be at /etc/apache2/apache2.conf. Add the followling line into it:

LoadModule wsgi_module <path-to-mod_wsgi.so>

Restart Apache2

Try

$ sudo apachectl restart

or

$ sudo service apache2 restart

or

$ sudo /etc/init.d/apache2 start

How to Check Apache Error Log

$ sudo less /var/log/apache2/error.log