How to use Django with Apache and mod_wsgi
Deploying Django with
Apache and
mod_wsgi is a tried and tested way to get
Django into production.
mod_wsgi is an Apache module which can host any Python
WSGI application,
including Django. Django will work with any version of Apache which supports
mod_wsgi.
The
official mod_wsgi documentation is fantastic; it’s your source for all
the details about how to use mod_wsgi. You’ll probably want to start with the
installation and configuration documentation.
Basic configuration
Once you’ve got mod_wsgi installed and activated, edit your Apache server’s
httpd.conf file and add:
The first bit in the
WSGIScriptAlias line is the base URL path you want to
serve your application at (
/ indicates the root url), and the second is the
location of a “WSGI file” – see below – on your system, usually inside of
your project package (
mysite in this example). This tells Apache to serve
any request below the given URL using the WSGI application defined in that
file.
The
WSGIPythonPath line ensures that your project package is available for
import on the Python path; in other words, that
import mysite works.
The
<Directory> piece just ensures that Apache can access your
wsgi.py file.
Next we’ll need to ensure this
wsgi.py with a WSGI application object
exists. As of Django version 1.4,
startproject will have created one
for you; otherwise, you’ll need to create it. See the
WSGI overview
documentation for the default contents you
should put in this file, and what else you can add to it.
Using a virtualenv
If you install your project’s Python dependencies inside a
virtualenv,
you’ll need to add the path to this virtualenv’s
site-packages directory to
your Python path as well. To do this, you can add another line to your
Apache configuration:
Make sure you give the correct path to your virtualenv, and replace
python2.X with the correct Python version (e.g.
python2.7).
Using mod_wsgi daemon mode
“Daemon mode” is the recommended mode for running mod_wsgi (on non-Windows
platforms). See the
official mod_wsgi documentation for details on setting
up daemon mode. The only change required to the above configuration if you use
daemon mode is that you can’t use
WSGIPythonPath; instead you should use
the
python-path option to
WSGIDaemonProcess, for example:
Serving files
Django doesn’t serve files itself; it leaves that job to whichever Web
server you choose.
We recommend using a separate Web server – i.e., one that’s not also running
Django – for serving media. Here are some good choices:
If, however, you have no option but to serve media files on the same Apache
VirtualHost as Django, you can set up Apache to serve some URLs as
static media, and others using the mod_wsgi interface to Django.
This example sets up Django at the site root, but explicitly serves
robots.txt,
favicon.ico, any CSS file, and anything in the
/static/ and
/media/ URL space as a static file. All other URLs
will be served using mod_wsgi:
Serving the admin files
Note that the Django development server automatically serves the static files
of the admin app (and any other installed apps), but this is not the case when
you use any other server arrangement. You’re responsible for setting up Apache,
or whichever media server you’re using, to serve the admin files.
The admin files live in (
django/contrib/admin/static/admin) of the
Django distribution.
We
strongly recommend using
django.contrib.staticfiles to handle the
admin files (along with a Web server as outlined in the previous section; this
means using the
collectstatic management command to collect the
static files in
STATIC_ROOT, and then configuring your Web server to
serve
STATIC_ROOT at
STATIC_URL), but here are three
other approaches: