Deploy a Django Project with Apache Server
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