modwsgi.txt 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. ==========================================
  2. How to use Django with Apache and mod_wsgi
  3. ==========================================
  4. Deploying Django with Apache_ and `mod_wsgi`_ is a tried and tested way to get
  5. Django into production.
  6. .. _Apache: http://httpd.apache.org/
  7. .. _mod_wsgi: http://www.modwsgi.org/
  8. mod_wsgi is an Apache module which can host any Python WSGI_ application,
  9. including Django. Django will work with any version of Apache which supports
  10. mod_wsgi.
  11. .. _WSGI: http://www.wsgi.org
  12. The `official mod_wsgi documentation`_ is fantastic; it's your source for all
  13. the details about how to use mod_wsgi. You'll probably want to start with the
  14. `installation and configuration documentation`_.
  15. .. _official mod_wsgi documentation: http://modwsgi.readthedocs.org/
  16. .. _installation and configuration documentation: http://modwsgi.readthedocs.org/en/develop/installation.html
  17. Basic configuration
  18. ===================
  19. Once you've got mod_wsgi installed and activated, edit your Apache server's
  20. ``httpd.conf`` file and add the following. If you are using a version of Apache
  21. older than 2.4, replace ``Require all granted`` with ``Allow from all`` and
  22. also add the line ``Order deny,allow`` above it.
  23. .. code-block:: apache
  24. WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
  25. WSGIPythonPath /path/to/mysite.com
  26. <Directory /path/to/mysite.com/mysite>
  27. <Files wsgi.py>
  28. Require all granted
  29. </Files>
  30. </Directory>
  31. The first bit in the ``WSGIScriptAlias`` line is the base URL path you want to
  32. serve your application at (``/`` indicates the root url), and the second is the
  33. location of a "WSGI file" -- see below -- on your system, usually inside of
  34. your project package (``mysite`` in this example). This tells Apache to serve
  35. any request below the given URL using the WSGI application defined in that
  36. file.
  37. The ``WSGIPythonPath`` line ensures that your project package is available for
  38. import on the Python path; in other words, that ``import mysite`` works.
  39. The ``<Directory>`` piece just ensures that Apache can access your
  40. :file:`wsgi.py` file.
  41. Next we'll need to ensure this :file:`wsgi.py` with a WSGI application object
  42. exists. As of Django version 1.4, :djadmin:`startproject` will have created one
  43. for you; otherwise, you'll need to create it. See the :doc:`WSGI overview
  44. documentation</howto/deployment/wsgi/index>` for the default contents you
  45. should put in this file, and what else you can add to it.
  46. .. warning::
  47. If multiple Django sites are run in a single mod_wsgi process, all of them
  48. will use the settings of whichever one happens to run first. This can be
  49. solved by changing::
  50. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")
  51. in ``wsgi.py``, to::
  52. os.environ["DJANGO_SETTINGS_MODULE"] = "{{ project_name }}.settings"
  53. or by :ref:`using mod_wsgi daemon mode<daemon-mode>` and ensuring that each
  54. site runs in its own daemon process.
  55. Using a virtualenv
  56. ==================
  57. If you install your project's Python dependencies inside a `virtualenv`_,
  58. you'll need to add the path to this virtualenv's ``site-packages`` directory to
  59. your Python path as well. To do this, add an additional path to your
  60. ``WSGIPythonPath`` directive, with multiple paths separated by a colon (``:``)
  61. if using a UNIX-like system, or a semicolon (``;``) if using Windows. If any
  62. part of a directory path contains a space character, the complete argument
  63. string to ``WSGIPythonPath`` must be quoted:
  64. .. code-block:: apache
  65. WSGIPythonPath /path/to/mysite.com:/path/to/your/venv/lib/python3.X/site-packages
  66. Make sure you give the correct path to your virtualenv, and replace
  67. ``python3.X`` with the correct Python version (e.g. ``python3.4``).
  68. .. _virtualenv: http://www.virtualenv.org
  69. .. _daemon-mode:
  70. Using mod_wsgi daemon mode
  71. ==========================
  72. "Daemon mode" is the recommended mode for running mod_wsgi (on non-Windows
  73. platforms). To create the required daemon process group and delegate the
  74. Django instance to run in it, you will need to add appropriate
  75. ``WSGIDaemonProcess`` and ``WSGIProcessGroup`` directives. A further change
  76. required to the above configuration if you use daemon mode is that you can't
  77. use ``WSGIPythonPath``; instead you should use the ``python-path`` option to
  78. ``WSGIDaemonProcess``, for example:
  79. .. code-block:: apache
  80. WSGIDaemonProcess example.com python-path=/path/to/mysite.com:/path/to/venv/lib/python2.7/site-packages
  81. WSGIProcessGroup example.com
  82. If you want to serve your project in a subdirectory
  83. (``http://example.com/mysite`` in this example), you can add ``WSGIScriptAlias``
  84. to the configuration above:
  85. .. code-block:: apache
  86. WSGIScriptAlias /mysite /path/to/mysite.com/mysite/wsgi.py process-group=example.com
  87. See the official mod_wsgi documentation for `details on setting up daemon
  88. mode`_.
  89. .. _details on setting up daemon mode: http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide#Delegation_To_Daemon_Process
  90. .. _serving-files:
  91. Serving files
  92. =============
  93. Django doesn't serve files itself; it leaves that job to whichever Web
  94. server you choose.
  95. We recommend using a separate Web server -- i.e., one that's not also running
  96. Django -- for serving media. Here are some good choices:
  97. * Nginx_
  98. * A stripped-down version of Apache_
  99. If, however, you have no option but to serve media files on the same Apache
  100. ``VirtualHost`` as Django, you can set up Apache to serve some URLs as
  101. static media, and others using the mod_wsgi interface to Django.
  102. This example sets up Django at the site root, but explicitly serves
  103. ``robots.txt``, ``favicon.ico``, any CSS file, and anything in the
  104. ``/static/`` and ``/media/`` URL space as a static file. All other URLs
  105. will be served using mod_wsgi:
  106. .. code-block:: apache
  107. Alias /robots.txt /path/to/mysite.com/static/robots.txt
  108. Alias /favicon.ico /path/to/mysite.com/static/favicon.ico
  109. Alias /media/ /path/to/mysite.com/media/
  110. Alias /static/ /path/to/mysite.com/static/
  111. <Directory /path/to/mysite.com/static>
  112. Require all granted
  113. </Directory>
  114. <Directory /path/to/mysite.com/media>
  115. Require all granted
  116. </Directory>
  117. WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
  118. <Directory /path/to/mysite.com/mysite>
  119. <Files wsgi.py>
  120. Require all granted
  121. </Files>
  122. </Directory>
  123. If you are using a version of Apache older than 2.4, replace
  124. ``Require all granted`` with ``Allow from all`` and also add the line
  125. ``Order deny,allow`` above it.
  126. .. _Nginx: http://wiki.nginx.org/Main
  127. .. _Apache: http://httpd.apache.org/
  128. .. More details on configuring a mod_wsgi site to serve static files can be found
  129. .. in the mod_wsgi documentation on `hosting static files`_.
  130. .. _hosting static files: http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines#Hosting_Of_Static_Files
  131. .. _serving-the-admin-files:
  132. Serving the admin files
  133. =======================
  134. When :mod:`django.contrib.staticfiles` is in :setting:`INSTALLED_APPS`, the
  135. Django development server automatically serves the static files of the
  136. admin app (and any other installed apps). This is however not the case when you
  137. use any other server arrangement. You're responsible for setting up Apache, or
  138. whichever Web server you're using, to serve the admin files.
  139. The admin files live in (:file:`django/contrib/admin/static/admin`) of the
  140. Django distribution.
  141. We **strongly** recommend using :mod:`django.contrib.staticfiles` to handle the
  142. admin files (along with a Web server as outlined in the previous section; this
  143. means using the :djadmin:`collectstatic` management command to collect the
  144. static files in :setting:`STATIC_ROOT`, and then configuring your Web server to
  145. serve :setting:`STATIC_ROOT` at :setting:`STATIC_URL`), but here are three
  146. other approaches:
  147. 1. Create a symbolic link to the admin static files from within your
  148. document root (this may require ``+FollowSymLinks`` in your Apache
  149. configuration).
  150. 2. Use an ``Alias`` directive, as demonstrated above, to alias the appropriate
  151. URL (probably :setting:`STATIC_URL` + ``admin/``) to the actual location of
  152. the admin files.
  153. 3. Copy the admin static files so that they live within your Apache
  154. document root.
  155. Authenticating against Django's user database from Apache
  156. =========================================================
  157. Django provides a handler to allow Apache to authenticate users directly
  158. against Django's authentication backends. See the :doc:`mod_wsgi authentication
  159. documentation </howto/deployment/wsgi/apache-auth>`.
  160. If you get a UnicodeEncodeError
  161. ===============================
  162. If you're taking advantage of the internationalization features of Django (see
  163. :doc:`/topics/i18n/index`) and you intend to allow users to upload files, you must
  164. ensure that the environment used to start Apache is configured to accept
  165. non-ASCII file names. If your environment is not correctly configured, you
  166. will trigger ``UnicodeEncodeError`` exceptions when calling functions like
  167. the ones in :mod:`os.path` on filenames that contain non-ASCII characters.
  168. To avoid these problems, the environment used to start Apache should contain
  169. settings analogous to the following::
  170. export LANG='en_US.UTF-8'
  171. export LC_ALL='en_US.UTF-8'
  172. Consult the documentation for your operating system for the appropriate syntax
  173. and location to put these configuration items; ``/etc/apache2/envvars`` is a
  174. common location on Unix platforms. Once you have added these statements
  175. to your environment, restart Apache.