Как обслуживать приложения Django с помощью Apache и mod_wsgi в Debian 8

Вступление

Django - это мощный веб-фреймворк, который может помочь вам быстро запустить приложение Python или веб-сайт. Django включает в себя упрощенный сервер разработки для локального тестирования кода, но для всего, что связано с производством, требуется более безопасный и мощный веб-сервер.

В этом руководстве мы продемонстрируем, как установить и настроить Django в виртуальной среде Python. Затем мы настроим Apache перед нашим приложением, чтобы он мог обрабатывать клиентские запросы непосредственно перед передачей запросов, требующих логики приложения, в приложение Django. Мы сделаем это с помощью модуля Apache + mod_wsgi +, который может взаимодействовать с Django через спецификацию интерфейса WSGI.

Предпосылки и цели

Чтобы выполнить это руководство, у вас должен быть свежий экземпляр сервера Debian 8 с пользователем без полномочий root с настроенными привилегиями + sudo +. Вы можете узнать, как это настроить, запустив наше https://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-8 руководство по настройке сервера на английском языке].

Мы будем устанавливать Django в виртуальной среде Python. Установка Django в среду, специфичную для вашего проекта, позволит обрабатывать ваши проекты и их требования отдельно.

Как только мы запустим наше приложение, мы настроим Apache для взаимодействия с приложением Django. Это будет сделано с помощью модуля Apache + mod_wsgi +, который может преобразовывать HTTP-запросы в предсказуемый формат приложения, определенный спецификацией WSGI. Вы можете узнать больше о WSGI, прочитав связанный раздел на https://www.digitalocean.com/community/tutorials/how-to-set-up-uwsgi-and-nginx-to-serve-python-apps-on -ubuntu-14-04 # определения и понятия [это руководство].

Давайте начнем.

Установить пакеты из репозитория Debian

Чтобы начать процесс, мы загрузим и установим все нужные нам элементы из репозиториев Debian. Это будет включать веб-сервер Apache, модуль + mod_wsgi +, используемый для взаимодействия с нашим приложением Django, и + pip +, менеджер пакетов Python, который можно использовать для загрузки наших инструментов, связанных с Python.

Чтобы получить все, что нам нужно, обновите локальный индекс пакетов вашего сервера, а затем установите соответствующие пакеты.

Если вы используете Django с * Python 2 *, вам понадобятся следующие команды:

sudo apt-get update
sudo apt-get install python-pip apache2 libapache2-mod-wsgi

Если вместо этого вы используете Django с * Python 3 *, вам понадобится альтернативный модуль Apache и пакет + pip +. Соответствующие команды в этом случае:

sudo apt-get update
sudo apt-get install python3-pip apache2 libapache2-mod-wsgi-py3

Теперь, когда у нас есть компоненты из репозиториев Debian, мы можем начать работу над нашим проектом Django.

Настройте виртуальную среду Python

Первым шагом является создание виртуальной среды Python, чтобы наш проект Django был отделен от системных инструментов и любых других проектов Python, над которыми мы можем работать. Нам нужно установить команду + virtualenv + для создания этих сред. Мы можем получить этот пакет используя + pip.

Если вы используете * Python 2 *, введите:

sudo pip install virtualenv

Если вы используете * Python 3 *, введите:

sudo pip3 install virtualenv

С установленным + virtualenv + мы можем приступить к формированию нашего проекта. Создайте каталог, в котором вы хотите сохранить свой проект, и перейдите в каталог:

mkdir ~/
cd ~/

В каталоге проекта создайте виртуальную среду Python, набрав:

virtualenv

Это создаст каталог с именем ` в вашем каталоге `. Внутри он установит локальную версию Python и локальную версию + pip +. Мы можем использовать это для установки и настройки изолированной среды Python для нашего проекта.

Перед установкой требований Python для нашего проекта нам необходимо активировать виртуальную среду. Вы можете сделать это, набрав:

source ~///bin/activate

Ваше приглашение должно измениться, чтобы указать, что вы сейчас работаете в виртуальной среде Python. Это будет выглядеть примерно так: + () @: ~ / $ +.

Когда ваша виртуальная среда активна, установите Django с локальным экземпляром + pip +:

pip install django

Это установит пакет Django в вашу виртуальную среду Python.

Создать и настроить новый проект Django

Теперь, когда Django установлен в нашей виртуальной среде, мы можем создавать файлы проекта Django.

Создать проект Django

Поскольку у нас уже есть каталог родительского проекта в + ~ / +, мы скажем Django установить файлы здесь. Команда создаст каталог второго уровня, содержащий фактический код. Он также поместит сценарий управления в каталог текущего проекта. Ключом к достижению правильной структуры каталогов является перечисление родительского каталога после имени проекта:

django-admin.py startproject  ~/

Вы должны получить структуру каталогов, которая выглядит следующим образом:

.
└── ./myproject/          # parent project directory
   ├── manage.py         # Django management script
   ├── myproject/            # project code directory
   │   ├── __init__.py
   │   ├── settings.py
   │   ├── urls.py
   │   └── wsgi.py
   └── myprojectenv/     # project virtual environment directory
       └── . . .

Проверка соответствия вашей структуры каталогов с этим может помочь минимизировать ошибки в дальнейшем.

Настройте параметры проекта

Первое, что мы должны сделать с нашими недавно созданными файлами проекта, это настроить параметры. Откройте файл настроек в вашем текстовом редакторе:

nano ~///settings.py

Для простоты мы собираемся использовать базу данных SQLite по умолчанию в этом руководстве, поэтому нам не нужно слишком много менять. Мы сосредоточимся на настройке разрешенных хостов для ограничения доменов, на которые мы отвечаем, и на настройке каталога статических файлов, где Django будет размещать статические файлы, чтобы веб-сервер мог легко их обслуживать.

Начните с поиска строки + ALLOWED_HOSTS +. В квадратных скобках введите публичный IP-адрес вашего сервера, доменное имя или оба. Каждое значение должно быть заключено в кавычки и разделено запятой, как обычный список Python. Также неплохо добавить локальные адреса, такие как + 127.0.0.1 + и + 127.0.1.1 +:

~ / MyProject / MyProject / settings.py

. . .
ALLOWED_HOSTS = ["", "127.0.0.1", "127.0.1.1"]
. . .

В нижней части файла мы установим Django + STATIC_ROOT +. Django может собирать и выводить все статические ресурсы в известный каталог, чтобы веб-сервер мог обслуживать их напрямую. Мы будем использовать немного Python, чтобы сказать ему использовать каталог «static» в главном каталоге нашего проекта:

~ / MyProject / MyProject / settings.py

. . .

STATIC_URL = '/static/'

Сохраните и закройте файл, когда вы закончите.

Завершите начальную настройку проекта

Теперь мы можем перенести исходную схему базы данных в нашу базу данных SQLite, используя скрипт управления:

cd ~/
./manage.py makemigrations
./manage.py migrate

Создайте административного пользователя для проекта, набрав:

./manage.py createsuperuser

Вам нужно будет выбрать имя пользователя, указать адрес электронной почты, а также выбрать и подтвердить пароль.

Мы можем собрать весь статический контент в каталог, который мы определили с помощью + STATIC_ROOT +, набрав:

./manage.py collectstatic

Вам нужно будет подтвердить операцию. Как и ожидалось, статические файлы будут помещены в каталог с именем + static + в каталоге вашего проекта.

Возможно, вам придется настроить параметры брандмауэра, чтобы разрешить трафик на наш сервер разработки Django, который мы будем использовать через порт 8000.

Если вы используете брандмауэр + ufw +, вы можете разрешить трафик на порт 8000, набрав:

sudo ufw allow 8000

Если вы используете + iptables +, точная команда, которая вам нужна, зависит от вашей текущей конфигурации брандмауэра. Для большинства конфигураций эта команда должна работать:

sudo iptables -I INPUT -p tcp --dport 8000 -j ACCEPT

Наконец, вы можете протестировать свой проект, запустив сервер разработки Django с помощью этой команды:

./manage.py runserver 0.0.0.0:8000

В веб-браузере перейдите к доменному имени или IP-адресу вашего сервера, за которым следует +: 8000 +:

http://:8000

Вы должны увидеть страницу индекса по умолчанию Django:

изображение: https: //assets.digitalocean.com/articles/django_uwsgi_nginx_1404/sample_site.png [индекс по умолчанию в Django]

Если вы добавите + / admin + в конец URL-адреса в адресной строке, вам будет предложено ввести имя пользователя и пароль администратора, которые вы создали с помощью команды + createuperuser:

изображение: https: //assets.digitalocean.com/articles/django_uwsgi_nginx_1404/admin_login.png [логин администратора Django]

После аутентификации вы можете получить доступ к стандартному интерфейсу администратора Django:

изображение: https: //assets.digitalocean.com/articles/django_uwsgi_nginx_1404/admin_interface.png [интерфейс администратора Django]

Когда вы закончите исследование, нажмите CTRL-C в окне терминала, чтобы выключить сервер разработки.

Сейчас мы закончили с Django, поэтому можем выйти из нашей виртуальной среды, набрав:

deactivate

Префикс + () + к вашей командной строке должен исчезнуть.

Настройте Apache

Теперь, когда ваш проект Django работает, мы можем настроить Apache в качестве внешнего интерфейса. Полученные клиентские соединения будут переведены в формат WSGI, который ожидает приложение Django, используя модуль + mod_wsgi +. Это должно было быть автоматически включено при установке ранее.

Чтобы настроить проход WSGI, нам нужно отредактировать файл виртуального хоста по умолчанию:

sudo nano /etc/apache2/sites-available/000-default.conf

Мы можем сохранить директивы, которые уже присутствуют в файле. Нам просто нужно добавить несколько дополнительных предметов.

Для начала давайте настроим статические файлы. Мы будем использовать псевдоним, чтобы сообщить Apache для сопоставления любых запросов, начинающихся с + / static +, со «статическим» каталогом в папке нашего проекта. Мы собрали статические активы там ранее. Мы настроим псевдоним и затем предоставим доступ к соответствующему каталогу с помощью блока каталога:

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
   . . .

   Alias /static /home///static
   <Directory /home///static>
       Require all granted
   </Directory>

</VirtualHost>

Далее мы предоставим доступ к файлу + wsgi.py + в каталоге проекта второго уровня, где хранится код Django. Для этого мы будем использовать раздел каталога с разделом файла внутри. Мы предоставим доступ к файлу внутри этой вложенной конструкции:

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
   . . .

   Alias /static /home///static
   <Directory /home///static>
       Require all granted
   </Directory>


   <Directory /home///>
       <Files wsgi.py>
           Require all granted
       </Files>
   </Directory>

</VirtualHost>

После того, как это настроено, мы готовы построить часть файла, которая фактически обрабатывает проход WSGI. Мы будем использовать режим демона для запуска процесса WSGI, который является рекомендуемой конфигурацией. Мы можем использовать директиву + WSGIDaemonProcess +, чтобы установить это.

Эта директива принимает произвольное имя для процесса. Мы будем использовать ++, чтобы оставаться последовательными. После этого мы создали домашнюю страницу Python, где Apache может найти все компоненты, которые могут потребоваться. Поскольку мы использовали виртуальную среду, мы можем указать это непосредственно в каталог нашей базовой виртуальной среды. После этого мы устанавливаем путь Python, указывающий на основу нашего проекта Django.

Далее нам нужно указать группу процессов. Это должно указывать на то же имя, которое мы выбрали для директивы + WSGIDaemonProcess + (в нашем случае + myproject +). Наконец, нам нужно установить псевдоним сценария, чтобы Apache передавал запросы корневого домена в файл + wsgi.py +:

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
   . . .

   Alias /static /home///static
   <Directory /home///static>
       Require all granted
   </Directory>

   <Directory /home///>
       <Files wsgi.py>
           Require all granted
       </Files>
   </Directory>

   WSGIDaemonProcess  python-home=/home/// python-path=/home//myproject
   WSGIProcessGroup
   WSGIScriptAlias / /home////wsgi.py

</VirtualHost>

Когда вы закончите вносить эти изменения, сохраните и закройте файл.

Завершение некоторых проблем с разрешениями

Если вы используете базу данных SQLite, которая по умолчанию используется в этой статье, вам необходимо разрешить процессу Apache доступ к этому файлу.

Для этого первым шагом является изменение разрешений, чтобы владелец группы базы данных мог читать и писать. Файл базы данных по умолчанию называется + db.sqlite3 + и должен находиться в каталоге вашего базового проекта:

chmod 664 ~//db.sqlite3
chmod 775 ~/

После этого нам нужно дать группе, под которой работает Apache, группе + www-data группу владения файлом:

sudo chown :www-data ~//db.sqlite3

Для записи в файл нам также необходимо предоставить группе Apache право собственности на родительский каталог базы данных:

sudo chown :www-data ~/

Нам нужно снова настроить наш брандмауэр. Нам больше не нужен открытый порт 8000, так как мы используем прокси через Apache, поэтому мы можем удалить это правило. Затем мы можем добавить исключение, чтобы разрешить трафик процессу Apache.

Если вы используете + ufw +, вы можете сделать это, набрав:

sudo ufw delete allow 8000
sudo ufw allow 'Apache Full'

Если вы используете + iptables +, соответствующие команды будут выглядеть примерно так:

sudo iptables -D INPUT -p tcp --dport 8000 -j ACCEPT
sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT

Проверьте файлы Apache, чтобы убедиться, что вы не допустили синтаксических ошибок:

sudo apache2ctl configtest

Пока последняя строка вывода выглядит так, ваши файлы находятся в хорошей форме:

Output. . .
Syntax OK

Как только эти шаги будут выполнены, вы готовы перезапустить службу Apache, чтобы применить сделанные вами изменения. Перезапустите Apache, набрав:

sudo systemctl restart apache2

Теперь вы сможете получить доступ к своему сайту Django, перейдя по доменному имени или IP-адресу вашего сервера без указания порта. Обычный сайт и интерфейс администратора должны работать как положено.

Следующие шаги

После проверки доступности вашего приложения важно обеспечить безопасность трафика в вашем приложении.

Если у вас есть доменное имя для вашего приложения, самый простой способ защитить ваше приложение с помощью бесплатного SSL-сертификата от Let’s Encrypt. Следуйте нашему Let руководству по шифрованию Apache для Debian 8, чтобы узнать, как установить это.

Если у вас * нет * доменного имени для вашего приложения и вы используете его для своих собственных целей или для тестирования, вы всегда можете создать самозаверяющий сертификат. Вы можете узнать, как настроить это с нашим https://www.digitalocean.com/community/tutorials/how-to-create-a-ssl-certificate-on-apache-for-debian-8 руководством по созданию себя SSL-сертификаты для Apache в Debian 8].

Заключение

В этом руководстве мы создали проект Django в собственной виртуальной среде. Мы настроили Apache с помощью + mod_wsgi + для обработки клиентских запросов и взаимодействия с приложением Django.

Django упрощает создание проектов и приложений, предоставляя множество общих частей, позволяя вам сосредоточиться на уникальных элементах. Используя общую цепочку инструментов, описанную в этой статье, вы можете легко обслуживать созданные вами приложения с одного сервера.

Related