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

Как запустить Django с mod_wsgi и Apache с виртуальной средой Python на Debian VPS


Введение

Работа с приложениями Django и приложениями Python в целом является сложной задачей с использованием множества инструментов. Есть несколько способов достижения одной и той же цели, и часто нет единого способа сделать что-то.

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

В этом тексте будет сделано несколько предположений:

  • Вы уже настроили свою каплю с Debian 7.0 или более поздней версии. Между разными дистрибутивами Linux есть много различий; поэтому для ясности мы сосредоточимся на сервере Debian.
  • Вы хотя бы немного знакомы с распространенными инструментами Python, такими как менеджер пакетов pip и virtualenv, для создания виртуальных сред. Эти инструменты прекрасно описаны в этой статье.
  • Вы, по крайней мере, немного знакомы со структурой проекта Django, так как в этой статье не рассматривается использование и настройка самого Django.
  • Вы знакомы с основами администрирования Apache, так как в этом руководстве рассматривается только простая установка самого сервера и необходимые изменения конфигурации для сопряжения Django с Apache.

Предпосылки

Перед установкой новых пакетов рекомендуется обновить системные пакеты и индексы пакетов. Для этого выполните:

apt-get update
apt-get upgrade

Установка Апача

Поскольку в этом тексте основное внимание уделяется использованию Apache для обслуживания приложения, необходим сам сервер. Для установки необходимых пакетов выполните:

apt-get install apache2

Сразу после установки Apache уже будет запущен. Вы можете проверить, правильно ли настроен веб-сервер Apache, открыв веб-браузер и указав в нем IP-адрес сервера. Вы должны увидеть простое это работает! страницу на экране.

Установка pip и virtualenv

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

Для этого выполните:

apt-get install python-pip python-virtualenv

Эта команда установит pip и virtualenv из репозитория пакетов Debian. Вы можете убедиться, что оба инструмента установлены правильно, запустив их с переключателем --version.

root@django:~# virtualenv --version
1.7.1.2
root@django:~# pip --version
pip 1.1 from /usr/lib/python2.7/dist-packages (python 2.7)
root@django:~#

Создание виртуальной среды с помощью virtualenv

При установке Apache автоматически создается каталог /var/www, в котором устанавливается корневой каталог веб-сервера по умолчанию. Мы поместим туда наше новое приложение Django со всеми его зависимостями.

Давайте создадим новый каталог с именем sampleapp внутри этого каталога и войдем в новый каталог:

cd /var/www
mkdir sampleapp
cd sampleapp

Затем давайте создадим новую виртуальную среду, используя virtualenv. Виртуальная среда Python — это, по сути, каталог, в котором находится интерпретатор Python и локальный экземпляр pip. Локальный экземпляр pip устанавливает все пакеты внутри виртуальной среды. Таким образом, никакие установленные пакеты не загрязняют глобальную установку Python, а также нет возможности конфликта версий пакетов в гипотетическом сценарии двух приложений, работающих с двумя разными версиями Django или любой другой библиотеки.

Чтобы создать новую виртуальную среду, введите:

virtualenv env

где env — имя виртуальной среды — это может быть любое другое слово. Вывод этой команды должен выглядеть так:

root@django:/var/www/sampleapp# virtualenv env
New python executable in env/bin/python
Installing distribute.............................................................................................................................................................................................done.
Installing pip...............done.
root@django:/var/www/sampleapp#

Теперь виртуальная среда готова и может использоваться двумя различными способами.

Один из способов — запускать команды напрямую с помощью интерпретатора виртуальной среды. При использовании этого метода необходимо всегда помнить о выполнении правильного экземпляра интерпретатора или pip, так как существует возможность запуска общесистемного.

root@django:/var/www/sampleapp# env/bin/pip --version
pip 1.1 from /var/www/sampleapp/env/lib/python2.7/site-packages/pip-1.1-py2.7.egg (python 2.7)
root@django:/var/www/sampleapp# env/bin/python --version
Python 2.7.3
root@django:/var/www/sampleapp#

Другой способ — сначала активировать среду, используя

source env/bin/activate

затем имя среды будет добавлено к командной строке как таковое

root@django:/var/www/sampleapp# source env/bin/activate
(env)root@django:/var/www/sampleapp#

и все выполняемые команды будут использовать локальные версии виртуальной среды

(env)root@django:/var/www/sampleapp# pip --version
pip 1.1 from /var/www/sampleapp/env/lib/python2.7/site-packages/pip-1.1-py2.7.egg (python 2.7)
(env)root@django:/var/www/sampleapp# python --version
Python 2.7.3
(env)root@django:/var/www/sampleapp#

так легче работать; однако необходимо деактивировать среду после завершения работы с помощью следующей команды

deactivate

это вернет оболочку в нормальное состояние

(env)root@django:/var/www/sampleapp# deactivate
root@django:/var/www/sampleapp#

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

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

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

env/bin/pip install django

Последние сообщения, отображаемые после выполнения этой команды, должны выглядеть так

Successfully installed django
Cleaning up...

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

root@django:/var/www/sampleapp# python
Python 2.7.3 (default, Mar 13 2014, 11:03:55)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named django
>>> exit()

Импорт с использованием общесистемного интерпретатора не удался, тогда как

root@django:/var/www/sampleapp# env/bin/python
Python 2.7.3 (default, Mar 13 2014, 11:03:55)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>>

тот, который выполнялся внутри виртуальной среды, удался.

Создание первого проекта Django

Чтобы создать простой базовый пример проекта, мы можем использовать скрипт django-admin.py следующим образом:

 env/bin/django-admin.py startproject sampleapp .

Обратите внимание на завершающий . в команде — без него проект будет создан в дополнительном подкаталоге. После выполнения этой команды в /var/www/sampleapp будет создан новый каталог sampleapp и скрипт manage.py. Сценарий manage.py используется для выполнения команд Django для этого конкретного проекта. Одним из возможных применений manage.py является запуск экземпляра тестового сервера, чтобы убедиться, что все работает должным образом.

Пожалуйста, выполните:

env/bin/python manage.py runserver 0.0.0.0:8000

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

Validating models...

0 errors found
April 08, 2014 - 12:29:31
Django version 1.6.2, using settings 'sampleapp.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.

Если вы откроете IP-адрес своего сервера с портом 8000 в своем браузере (адрес должен выглядеть как http://:8000/), вы должны увидеть, что это сработало! пример страницы Джанго. Это результат, к которому мы будем стремиться, используя веб-сервер Apache вместо встроенного сервера разработки Django.

Поскольку приложение Django работает правильно, мы можем приступить к сопряжению приложения с Apache.

Установка mod_wsgi для Apache

Самый простой и также рекомендуемый способ обслуживания приложений Python с использованием Apache — использование модуля mod_wsgi. Он не установлен по умолчанию ни с Python, ни с Apache, поэтому нам нужно установить дополнительный пакет.

apt-get install libapache2-mod-wsgi

Следующим шагом будет настройка виртуального хоста Apache по умолчанию, который обслуживался в начале статьи. Это работает! страница для обслуживания нашего приложения Django.

Настройка mod_wsgi на виртуальном хосте по умолчанию

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

Откройте файл конфигурации виртуального хоста по умолчанию в редакторе nano.

nano /etc/apache2/sites-enabled/000-default 

и добавьте три следующие строки чуть ниже

WSGIDaemonProcess sampleapp python-path=/var/www/sampleapp:/var/www/sampleapp/env/lib/python2.7/site-packages
WSGIProcessGroup sampleapp
WSGIScriptAlias / /var/www/sampleapp/sampleapp/wsgi.py

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

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

Путь должен содержать два каталога: каталог самого проекта Django — /var/www/sampleapp — и каталог пакетов Python внутри нашей виртуальной среды для этого проекта — /var/www/sampleapp /env/lib/python2.7/сайт-пакеты. Каталоги в определении пути разделяются знаком двоеточия.

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

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

После этих изменений необходимо перезапустить Apache

service apache2 restart

После этого при открытии веб-браузера на IP-адресе вашего сервера без каких-либо дополнительных портов вы должны увидеть ту же страницу Django, что и раньше, вместо начальной. Это работает! страницу, которую мы видели ранее.

На этом наша конфигурация завершена.

Обратите внимание: использование виртуального хоста по умолчанию без дополнительных усилий не является рекомендуемым способом настройки рабочего сервера. Он используется в демонстрационных целях.

дальнейшее чтение

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

Одним из лучших ресурсов является официальная документация Django. Есть также отличные статьи о DigitalOcean, которые можно найти, используя Django в качестве ключевого слова для поиска.

Статья представлена: Матеушем Папьерником