modwsgi.txt 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  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://code.google.com/p/modwsgi/
  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://www.modwsgi.org/
  16. .. _installation and configuration documentation: http://www.modwsgi.org/wiki/InstallationInstructions
  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::
  21. WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
  22. WSGIPythonPath /path/to/mysite.com
  23. <Directory /path/to/mysite.com/mysite>
  24. <Files wsgi.py>
  25. Order deny,allow
  26. Allow from all
  27. </Files>
  28. </Directory>
  29. The first bit in the ``WSGIScriptAlias`` line is the base URL path you want to
  30. serve your application at (``/`` indicates the root url), and the second is the
  31. location of a "WSGI file" -- see below -- on your system, usually inside of
  32. your project package (``mysite`` in this example). This tells Apache to serve
  33. any request below the given URL using the WSGI application defined in that
  34. file.
  35. The ``WSGIPythonPath`` line ensures that your project package is available for
  36. import on the Python path; in other words, that ``import mysite`` works.
  37. The ``<Directory>`` piece just ensures that Apache can access your
  38. :file:`wsgi.py` file.
  39. Next we'll need to ensure this :file:`wsgi.py` with a WSGI application object
  40. exists. As of Django version 1.4, :djadmin:`startproject` will have created one
  41. for you; otherwise, you'll need to create it. See the :doc:`WSGI overview
  42. documentation</howto/deployment/wsgi/index>` for the default contents you
  43. should put in this file, and what else you can add to it.
  44. Using a virtualenv
  45. ==================
  46. If you install your project's Python dependencies inside a `virtualenv`_,
  47. you'll need to add the path to this virtualenv's ``site-packages`` directory to
  48. your Python path as well. To do this, you can add another line to your
  49. Apache configuration::
  50. WSGIPythonPath /path/to/your/venv/lib/python2.X/site-packages
  51. Make sure you give the correct path to your virtualenv, and replace
  52. ``python2.X`` with the correct Python version (e.g. ``python2.7``).
  53. .. _virtualenv: http://www.virtualenv.org
  54. Using mod_wsgi daemon mode
  55. ==========================
  56. "Daemon mode" is the recommended mode for running mod_wsgi (on non-Windows
  57. platforms). See the `official mod_wsgi documentation`_ for details on setting
  58. up daemon mode. The only change required to the above configuration if you use
  59. daemon mode is that you can't use ``WSGIPythonPath``; instead you should use
  60. the ``python-path`` option to ``WSGIDaemonProcess``, for example::
  61. WSGIDaemonProcess example.com python-path=/path/to/mysite.com:/path/to/venv/lib/python2.7/site-packages
  62. .. _serving-files:
  63. Serving files
  64. =============
  65. Django doesn't serve files itself; it leaves that job to whichever Web
  66. server you choose.
  67. We recommend using a separate Web server -- i.e., one that's not also running
  68. Django -- for serving media. Here are some good choices:
  69. * lighttpd_
  70. * Nginx_
  71. * TUX_
  72. * A stripped-down version of Apache_
  73. * Cherokee_
  74. If, however, you have no option but to serve media files on the same Apache
  75. ``VirtualHost`` as Django, you can set up Apache to serve some URLs as
  76. static media, and others using the mod_wsgi interface to Django.
  77. This example sets up Django at the site root, but explicitly serves
  78. ``robots.txt``, ``favicon.ico``, any CSS file, and anything in the
  79. ``/static/`` and ``/media/`` URL space as a static file. All other URLs
  80. will be served using mod_wsgi::
  81. Alias /robots.txt /path/to/mysite.com/static/robots.txt
  82. Alias /favicon.ico /path/to/mysite.com/static/favicon.ico
  83. AliasMatch ^/([^/]*\.css) /path/to/mysite.com/static/styles/$1
  84. Alias /media/ /path/to/mysite.com/media/
  85. Alias /static/ /path/to/mysite.com/static/
  86. <Directory /path/to/mysite.com/static>
  87. Order deny,allow
  88. Allow from all
  89. </Directory>
  90. <Directory /path/to/mysite.com/media>
  91. Order deny,allow
  92. Allow from all
  93. </Directory>
  94. WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
  95. <Directory /path/to/mysite.com/mysite>
  96. <Files wsgi.py>
  97. Order allow,deny
  98. Allow from all
  99. </Files>
  100. </Directory>
  101. .. _lighttpd: http://www.lighttpd.net/
  102. .. _Nginx: http://wiki.nginx.org/Main
  103. .. _TUX: http://en.wikipedia.org/wiki/TUX_web_server
  104. .. _Apache: http://httpd.apache.org/
  105. .. _Cherokee: http://www.cherokee-project.com/
  106. .. More details on configuring a mod_wsgi site to serve static files can be found
  107. .. in the mod_wsgi documentation on `hosting static files`_.
  108. .. _hosting static files: http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines#Hosting_Of_Static_Files
  109. .. _serving-the-admin-files:
  110. Serving the admin files
  111. =======================
  112. Note that the Django development server automatically serves the static files
  113. of the admin app (and any other installed apps), but this is not the case when
  114. you use any other server arrangement. You're responsible for setting up Apache,
  115. or whichever media server you're using, to serve the admin files.
  116. The admin files live in (:file:`django/contrib/admin/static/admin`) of the
  117. Django distribution.
  118. We **strongly** recommend using :mod:`django.contrib.staticfiles` to handle the
  119. admin files (along with a Web server as outlined in the previous section; this
  120. means using the :djadmin:`collectstatic` management command to collect the
  121. static files in :setting:`STATIC_ROOT`, and then configuring your Web server to
  122. serve :setting:`STATIC_ROOT` at :setting:`STATIC_URL`), but here are three
  123. other approaches:
  124. 1. Create a symbolic link to the admin static files from within your
  125. document root (this may require ``+FollowSymLinks`` in your Apache
  126. configuration).
  127. 2. Use an ``Alias`` directive, as demonstrated above, to alias the appropriate
  128. URL (probably :setting:`STATIC_URL` + `admin/`) to the actual location of
  129. the admin files.
  130. 3. Copy the admin static files so that they live within your Apache
  131. document root.
  132. If you get a UnicodeEncodeError
  133. ===============================
  134. If you're taking advantage of the internationalization features of Django (see
  135. :doc:`/topics/i18n/index`) and you intend to allow users to upload files, you must
  136. ensure that the environment used to start Apache is configured to accept
  137. non-ASCII file names. If your environment is not correctly configured, you
  138. will trigger ``UnicodeEncodeError`` exceptions when calling functions like
  139. ``os.path()`` on filenames that contain non-ASCII characters.
  140. To avoid these problems, the environment used to start Apache should contain
  141. settings analogous to the following::
  142. export LANG='en_US.UTF-8'
  143. export LC_ALL='en_US.UTF-8'
  144. Consult the documentation for your operating system for the appropriate syntax
  145. and location to put these configuration items; ``/etc/apache2/envvars`` is a
  146. common location on Unix platforms. Once you have added these statements
  147. to your environment, restart Apache.