Поиск по сайту:

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


Введение

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

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

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

Чтобы выполнить это руководство, у вас должен быть новый экземпляр сервера Ubuntu 16.04 с пользователем без полномочий root с настроенными привилегиями sudo. Вы можете узнать, как это настроить, изучив наше руководство по начальной настройке сервера.

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

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

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

Установите пакеты из репозиториев Ubuntu

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

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

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

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

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

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

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

Теперь, когда у нас есть компоненты из репозиториев Ubuntu, мы можем начать работу над нашим проектом Django. Первый шаг — создать виртуальную среду Python, чтобы наш проект Django был отделен от системных инструментов и любых других проектов Python, над которыми мы можем работать.

Нам нужно установить команду virtualenv для создания этих сред. Мы можем получить это с помощью pip.

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

  1. sudo pip install virtualenv

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

  1. sudo pip3 install virtualenv

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

  1. mkdir ~/myproject
  2. cd ~/myproject

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

  1. virtualenv myprojectenv

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

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

  1. source myprojectenv/bin/activate

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

При активной виртуальной среде установите Django с локальным экземпляром pip:

Независимо от того, используете ли вы Python 2 или Python 3, при активации виртуальной среды мы должны использовать команду pip (а не pip3).

  1. pip install django

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

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

Создайте проект Джанго

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

  1. django-admin.py startproject myproject .

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

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

  1. nano myproject/settings.py

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

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

. . .
ALLOWED_HOSTS = ["server_domain_or_IP"]
. . .

Внизу файла мы добавим строку для настройки этого каталога. Django использует параметр STATIC_ROOT для определения каталога, в который должны помещаться эти файлы. Мы воспользуемся Python, чтобы указать ему использовать каталог с именем \static в основном каталоге нашего проекта:

. . .

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

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

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

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

  1. cd ~/myproject
  2. ./manage.py makemigrations
  3. ./manage.py migrate

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

  1. ./manage.py createsuperuser

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

Мы можем собрать весь статический контент в каталог, который мы настроили, набрав:

  1. ./manage.py collectstatic

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

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

Разрешите подключения к серверу разработки, набрав:

  1. sudo ufw allow 8000

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

  1. ./manage.py runserver 0.0.0.0:8000

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

http://server_domain_or_IP:8000

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

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

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

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

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

  1. deactivate

Настроить Apache

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

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

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

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

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

<VirtualHost *:80>
    . . .

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

</VirtualHost>

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

<VirtualHost *:80>
    . . .

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

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

</VirtualHost>

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

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

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

<VirtualHost *:80>
    . . .

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

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

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

</VirtualHost>

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

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

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

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

  1. chmod 664 ~/myproject/db.sqlite3

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

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

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

  1. sudo chown :www-data ~/myproject

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

  1. sudo ufw delete allow 8000
  2. sudo ufw allow 'Apache Full'

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

  1. sudo apache2ctl configtest

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

Output
. . . Syntax OK

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

  1. sudo systemctl restart apache2

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

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

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

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

Если у вас нет доменного имени для вашего приложения и вы используете его для своих целей или для тестирования, вы всегда можете создать самозаверяющий сертификат. Вы можете узнать, как это настроить, из нашего руководства по созданию самозаверяющих SSL-сертификатов для Apache в Ubuntu 16.04.

Заключение

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

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