modwsgi.txt 8.83 KB
Newer Older
1 2 3 4 5 6 7 8
==========================================
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.

.. _Apache: http://httpd.apache.org/
9
.. _mod_wsgi: http://www.modwsgi.org/
10 11 12 13 14 15 16 17 18 19 20

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.

.. _WSGI: http://www.wsgi.org

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`_.

21 22
.. _official mod_wsgi documentation: http://modwsgi.readthedocs.org/
.. _installation and configuration documentation: http://modwsgi.readthedocs.org/en/develop/installation.html
23 24 25 26 27

Basic configuration
===================

Once you've got mod_wsgi installed and activated, edit your Apache server's
28
``httpd.conf`` file and add the following. If you are using a version of Apache
29 30
older than 2.4, replace ``Require all granted`` with ``Allow from all`` and
also add the line ``Order deny,allow`` above it.
31 32

.. code-block:: apache
33 34 35 36 37 38

    WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
    WSGIPythonPath /path/to/mysite.com

    <Directory /path/to/mysite.com/mysite>
    <Files wsgi.py>
39
    Require all granted
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
    </Files>
    </Directory>

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
:file:`wsgi.py` file.

Next we'll need to ensure this :file:`wsgi.py` with a WSGI application object
exists. As of Django version 1.4, :djadmin:`startproject` will have created one
for you; otherwise, you'll need to create it. See the :doc:`WSGI overview
documentation</howto/deployment/wsgi/index>` for the default contents you
should put in this file, and what else you can add to it.

62 63
.. warning::

64 65 66
    If multiple Django sites are run in a single mod_wsgi process, all of them
    will use the settings of whichever one happens to run first. This can be
    solved by changing::
67

68 69 70 71 72 73 74 75
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")

    in ``wsgi.py``, to::

        os.environ["DJANGO_SETTINGS_MODULE"] = "{{ project_name }}.settings"

    or by :ref:`using mod_wsgi daemon mode<daemon-mode>` and ensuring that each
    site runs in its own daemon process.
76

77 78 79 80 81 82 83 84 85 86 87 88 89 90
.. admonition:: Fixing ``UnicodeEncodeError`` for file uploads

    If you get a ``UnicodeEncodeError`` when uploading files with file names
    that contain non-ASCII characters, make sure Apache is configured to accept
    non-ASCII file names::

        export LANG='en_US.UTF-8'
        export LC_ALL='en_US.UTF-8'

    A common location to put this configuration is ``/etc/apache2/envvars``.

    See the :ref:`unicode-files` section of the Unicode reference guide for
    details.

91 92 93 94 95
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
96
your Python path as well. To do this, add an additional path to your
97 98 99
``WSGIPythonPath`` directive, with multiple paths separated by a colon (``:``)
if using a UNIX-like system, or a semicolon (``;``) if using Windows. If any
part of a directory path contains a space character, the complete argument
100 101 102
string to ``WSGIPythonPath`` must be quoted:

.. code-block:: apache
103

104
    WSGIPythonPath /path/to/mysite.com:/path/to/your/venv/lib/python3.X/site-packages
105 106

Make sure you give the correct path to your virtualenv, and replace
107
``python3.X`` with the correct Python version (e.g. ``python3.4``).
108 109 110

.. _virtualenv: http://www.virtualenv.org

111 112
.. _daemon-mode:

113 114 115 116
Using mod_wsgi daemon mode
==========================

"Daemon mode" is the recommended mode for running mod_wsgi (on non-Windows
117 118 119 120 121
platforms). To create the required daemon process group and delegate the
Django instance to run in it, you will need to add appropriate
``WSGIDaemonProcess`` and ``WSGIProcessGroup`` directives. A further 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
122 123 124
``WSGIDaemonProcess``, for example:

.. code-block:: apache
125 126

    WSGIDaemonProcess example.com python-path=/path/to/mysite.com:/path/to/venv/lib/python2.7/site-packages
127 128
    WSGIProcessGroup example.com

129 130 131 132 133 134 135 136
If you want to serve your project in a subdirectory
(``http://example.com/mysite`` in this example), you can add ``WSGIScriptAlias``
to the configuration above:

.. code-block:: apache

    WSGIScriptAlias /mysite /path/to/mysite.com/mysite/wsgi.py process-group=example.com

137 138 139 140
See the official mod_wsgi documentation for `details on setting up daemon
mode`_.

.. _details on setting up daemon mode: http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide#Delegation_To_Daemon_Process
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162

.. _serving-files:

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:

* Nginx_
* A stripped-down version of Apache_

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
163 164 165
will be served using mod_wsgi:

.. code-block:: apache
166 167 168 169 170 171 172 173

    Alias /robots.txt /path/to/mysite.com/static/robots.txt
    Alias /favicon.ico /path/to/mysite.com/static/favicon.ico

    Alias /media/ /path/to/mysite.com/media/
    Alias /static/ /path/to/mysite.com/static/

    <Directory /path/to/mysite.com/static>
174
    Require all granted
175 176 177
    </Directory>

    <Directory /path/to/mysite.com/media>
178
    Require all granted
179 180 181 182 183 184
    </Directory>

    WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py

    <Directory /path/to/mysite.com/mysite>
    <Files wsgi.py>
185
    Require all granted
186 187 188
    </Files>
    </Directory>

189
If you are using a version of Apache older than 2.4, replace
190 191
``Require all granted`` with ``Allow from all`` and also add the line
``Order deny,allow`` above it.
192

193 194 195 196 197 198 199 200 201 202 203 204 205
.. _Nginx: http://wiki.nginx.org/Main
.. _Apache: http://httpd.apache.org/

.. More details on configuring a mod_wsgi site to serve static files can be found
.. in the mod_wsgi documentation on `hosting static files`_.

.. _hosting static files: http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines#Hosting_Of_Static_Files

.. _serving-the-admin-files:

Serving the admin files
=======================

206 207 208 209 210
When :mod:`django.contrib.staticfiles` is in :setting:`INSTALLED_APPS`, the
Django development server automatically serves the static files of the
admin app (and any other installed apps). This is however not the case when you
use any other server arrangement. You're responsible for setting up Apache, or
whichever Web server you're using, to serve the admin files.
211 212 213 214

The admin files live in (:file:`django/contrib/admin/static/admin`) of the
Django distribution.

215 216 217
We **strongly** recommend using :mod:`django.contrib.staticfiles` to handle the
admin files (along with a Web server as outlined in the previous section; this
means using the :djadmin:`collectstatic` management command to collect the
218
static files in :setting:`STATIC_ROOT`, and then configuring your Web server to
219 220
serve :setting:`STATIC_ROOT` at :setting:`STATIC_URL`), but here are three
other approaches:
221 222 223 224 225 226

1. Create a symbolic link to the admin static files from within your
   document root (this may require ``+FollowSymLinks`` in your Apache
   configuration).

2. Use an ``Alias`` directive, as demonstrated above, to alias the appropriate
227
   URL (probably :setting:`STATIC_URL` + ``admin/``) to the actual location of
228 229 230 231
   the admin files.

3. Copy the admin static files so that they live within your Apache
   document root.
232

233 234 235 236 237 238
Authenticating against Django's user database from Apache
=========================================================

Django provides a handler to allow Apache to authenticate users directly
against Django's authentication backends. See the :doc:`mod_wsgi authentication
documentation </howto/deployment/wsgi/apache-auth>`.