Как использовать 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. Более подробная информация представлена в руководстве по virtualenv для mod_wsgi.
Строка 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, а также все содержимое в /static/ и /media/ URL-пространстве как статические файлы. Все остальные 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/2.1/howto/deployment/wsgi/modwsgi/