Как использовать Django с Apache и mod_wsgi
Развёртывание Django с Apache и mod_wsgi — проверенный способ запуска Django в рабочей среде.
mod_wsgi — это модуль Apache, который может размещать любые Python-приложения WSGI, включая Django. Django будет работать с любой версией Apache, которая поддерживает mod_wsgi.
В официальной документации mod_wsgi вы найдёте все подробности о том, как использовать mod_wsgi. Начните, вероятно, с документации по установке и настройке.
Базовая настройка
После установки и активации mod_wsgi отредактируйте файл httpd.conf сервера Apache и добавьте следующее. Если вы используете версию Apache старше 2.4, замените Require all granted на Allow from all и добавьте строку Order deny,allow перед ней.
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 своего проекта внутри virtualenv, добавьте путь к virtualenv с помощью WSGIPythonHome. Более подробную информацию см. в руководстве mod_wsgi по virtualenv.
Строка WSGIPythonPath гарантирует, что пакет вашего проекта доступен для импорта в пути Python; другими словами, что import mysite работает.
Часть <Directory> просто гарантирует, что Apache может получить доступ к вашему файлу wsgi.py.
Далее нам нужно убедиться, что этот wsgi.py с объектом приложения WSGI существует. Начиная с версии Django 1.4, startproject создаст его для вас; в противном случае вам нужно его создать. См. документацию по обзору WSGI для содержимого по умолчанию, которое вы должны поместить в этот файл, и что ещё вы можете добавить в него.
Предупреждение
Если несколько сайтов Django работают в одном процессе mod_wsgi, все они будут использовать настройки того, который запустился первым. Это можно исправить, изменив:
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")
в wsgi.py, на:
os.environ["DJANGO_SETTINGS_MODULE"] = "{{ project_name }}.settings"
или используя режим демона mod_wsgi и убедившись, что каждый сайт работает в своём процессе демона.
Решение проблемы UnicodeEncodeError при загрузке файлов
Если при загрузке файлов с именами, содержащими не-ASCII символы, вы получаете UnicodeEncodeError, убедитесь, что Apache настроен на принятие имён файлов с не-ASCII символами:
export LANG='en_US.UTF-8' export LC_ALL='en_US.UTF-8'
Часто это настройка помещается в /etc/apache2/envvars.
См. раздел Файлы в руководстве по Unicode для получения подробных сведений.
Использование режима демона mod_wsgi
«Режим демона» — рекомендованный режим для работы mod_wsgi (на платформах, не Windows). Чтобы создать необходимую группу процессов демона и делегировать экземпляр Django для выполнения в ней, вам нужно добавить соответствующие директивы WSGIDaemonProcess и WSGIProcessGroup. Если вы используете режим демона, в настройке выше необходимо внести дополнительные изменения, так как вы не можете использовать WSGIPythonPath; вместо этого вы должны использовать параметр python-path для WSGIDaemonProcess, например:
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 по ссылке.
Предоставление файлов
Django не предоставляет файлы самостоятельно; он перекладывает эту задачу на выбранный вами веб-сервер.
Мы рекомендуем использовать отдельный веб-сервер (то есть такой, который не выполняет также Django) для предоставления медиафайлов. Вот несколько хороших вариантов:
Однако, если у вас нет другого выбора, кроме предоставления медиафайлов на том же сервере Apache VirtualHost с Django, вы можете настроить Apache на предоставление некоторых URL-адресов как статических медиафайлов, а другие — используя интерфейс mod_wsgi для Django.
В этом примере Django настроен на корневой URL, но предоставляет 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>
Если вы используете версию Apache старше 2.4, замените Require all granted на Allow from all и также добавьте строку Order deny,allow перед ней.
Предоставление файлов админки
Когда django.contrib.staticfiles находится в INSTALLED_APPS, сервер разработки Django автоматически предоставляет статические файлы приложения админки (и любых других установленных приложений). Однако это не так, когда вы используете другую схему сервера. Вам нужно настроить Apache или используемый вами веб-сервер на предоставление файлов админки.
Файлы админки находятся в (django/contrib/admin/static/admin) дистрибутива Django.
Мы настоятельно рекомендуем использовать django.contrib.staticfiles для обработки файлов админки (вместе с веб-сервером, как описано в предыдущем разделе; это означает использование команды управления collectstatic для сбора статических файлов в STATIC_ROOT, а затем настройку веб-сервера на предоставление STATIC_ROOT по адресу STATIC_URL), но вот три других подхода:
- Создайте символическую ссылку на статические файлы админки изнутри корня вашего документа (это может потребовать
+FollowSymLinksв вашей конфигурации Apache). - Используйте директиву
Alias, как показано выше, для привязки соответствующего URL (вероятно,STATIC_URL+admin/) к фактическому расположению файлов админки. - Скопируйте статические файлы админки так, чтобы они находились в корне документа вашего Apache.
Проверка подлинности против базы данных пользователей Django с помощью Apache
Django предоставляет обработчик, позволяющий Apache напрямую проверять подлинность пользователей по средствам бэкендов аутентификации Django. См. документацию по аутентификации mod_wsgi.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.11/howto/deployment/wsgi/modwsgi/