Как использовать Django с Apache и mod_wsgi
¶
Развертывание Django с помощью Apache и mod_wsgi - это проверенный и испытанный способ запустить Django в производство.
mod_wsgi - это модуль Apache, который может разместить любое приложение Python WSGI, включая Django. Django будет работать с любой версией Apache, которая поддерживает mod_wsgi.
official mod_wsgi documentation - это ваш источник всех подробностей о том, как использовать mod_wsgi. Скорее всего, вы захотите начать с installation and configuration documentation.
Базовая конфигурация¶
После установки и активации mod_wsgi отредактируйте файл httpd.conf вашего сервера Apache и добавьте следующее.
WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
WSGIPythonHome /path/to/venv
WSGIPythonPath /path/to/mysite.com
<Directory /path/to/mysite.com/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
Первый бит в строке WSGIScriptAlias
- это базовый путь URL, по которому вы хотите обслуживать ваше приложение (/
указывает на корневой url), а второй - местоположение «файла WSGI» - см. ниже - в вашей системе, обычно внутри пакета вашего проекта (mysite
в данном примере). Это указывает Apache обслуживать любой запрос ниже заданного URL, используя приложение WSGI, определенное в этом файле.
Если вы устанавливаете зависимости Python вашего проекта внутри virtual environment
, добавьте путь с помощью WSGIPythonHome
. Более подробную информацию смотрите в mod_wsgi virtual environment guide.
Строка WSGIPythonPath
гарантирует, что пакет вашего проекта доступен для импорта по пути Python; другими словами, что import mysite
работает.
Часть <Directory>
гарантирует, что Apache сможет получить доступ к вашему файлу wsgi.py
.
Далее нам нужно убедиться, что этот wsgi.py
с объектом приложения WSGI существует. Начиная с версии Django 1.4, startproject
создаст его за вас; в противном случае, вам придется создать его. Смотрите в WSGI overview documentation содержание по умолчанию, которое вы должны поместить в этот файл, и что еще вы можете добавить в него.
Предупреждение
Если несколько сайтов Django запущены в одном процессе mod_wsgi, все они будут использовать настройки того из них, который будет запущен первым. Это можно решить, изменив:
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")
в wsgi.py
, до:
os.environ["DJANGO_SETTINGS_MODULE"] = "{{ project_name }}.settings"
или по using mod_wsgi daemon mode и обеспечить, чтобы каждый сайт запускался в собственном процессе демона.
Исправление UnicodeEncodeError
для загрузки файлов
If you get a UnicodeEncodeError
when uploading or writing files with
file names or content that contains non-ASCII characters, make sure Apache
is configured to support UTF-8 encoding:
export LANG='en_US.UTF-8'
export LC_ALL='en_US.UTF-8'
Обычное место для размещения этой конфигурации - /etc/apache2/envvars
.
В качестве альтернативы, если вы using mod_wsgi daemon mode, вы можете добавить lang
и locale
опции к директиве WSGIDaemonProcess
:
WSGIDaemonProcess example.com lang='en_US.UTF-8' locale='en_US.UTF-8'
Подробности см. в разделе Файлы справочного руководства Unicode.
Использование режима демона mod_wsgi
¶
«Режим демона» - это рекомендуемый режим для запуска mod_wsgi (на платформах, отличных от Windows). Чтобы создать необходимую группу процессов daemon и делегировать экземпляр Django для запуска в ней, вам нужно добавить соответствующие директивы WSGIDaemonProcess
и WSGIProcessGroup
. Еще одно изменение, которое необходимо внести в приведенную выше конфигурацию, если вы используете режим демона, заключается в том, что вы не можете использовать WSGIProcessGroup
; вместо этого вы должны использовать опцию WSGIPythonPath
, например, python-path
:
WSGIDaemonProcess example.com python-home=/path/to/venv python-path=/path/to/mysite.com
WSGIProcessGroup example.com
Если вы хотите обслуживать ваш проект в подкаталоге (https://example.com/mysite
в данном примере), вы можете добавить WSGIScriptAlias
к конфигурации выше:
WSGIScriptAlias /mysite /path/to/mysite.com/mysite/wsgi.py process-group=example.com
См. официальную документацию mod_wsgi для details on setting up daemon mode.
Служебные файлы¶
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:
Однако если у вас нет другого выбора, кроме как обслуживать медиафайлы на том же Apache VirtualHost
, что и Django, вы можете настроить Apache на обслуживание некоторых URL как статических медиа, а других с помощью интерфейса mod_wsgi для Django.
Этот пример устанавливает Django в корне сайта, но обслуживает robots.txt
, favicon.ico
, и все, что находится в пространстве URL /static/
и /media/
как статический файл. Все остальные URL будут обслуживаться с помощью mod_wsgi:
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>
Require all granted
</Directory>
<Directory /path/to/mysite.com/media>
Require all granted
</Directory>
WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
<Directory /path/to/mysite.com/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
Обслуживание файлов администратора¶
When django.contrib.staticfiles
is in 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.
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:
- Создайте символическую ссылку на статические файлы администратора в корне документа (для этого может потребоваться
+FollowSymLinks
в конфигурации Apache). - Используйте директиву
Alias
, как показано выше, для псевдонима соответствующего URL (возможноSTATIC_URL
+admin/
) для фактического расположения файлов администратора. - Скопируйте статические файлы администратора так, чтобы они находились в корне документа Apache.
Аутентификация по базе данных пользователей Django из Apache¶
Django предоставляет обработчик, позволяющий Apache аутентифицировать пользователей непосредственно с помощью бэкендов аутентификации Django. См. раздел mod_wsgi authentication documentation.