Статьи

Развертывание приложения Django с mod_wsgi в Ubuntu 14.04

Программирование на Python Django — это бесплатный веб-фреймворк на основе Python с открытым исходным кодом. Django следует архитектурному шаблону MVC, уделяя особое внимание быстрому созданию ваших приложений. В последнее время Django стал популярным выбором для создания веб-приложений. Популярные сервисы, такие как Instagram, Bitbucket и Pinterest были разработаны с использованием Django.

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

mod_wsgi

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

Apache — один из самых популярных веб-серверов, а mod_wsgi — это модуль Apache, который используется для размещения приложений Python на Apache. Это также относительно простой способ развертывания приложения Django.

Python устанавливается по умолчанию в Ubuntu 14.04. Давайте теперь посмотрим на пошаговое руководство по развертыванию приложения Django с использованием mod_wsgi .

1. Создание приложения Django

файл view.py В этом разделе мы собираемся установить необходимые пакеты и настроить приложение Hello World Django, которое будет обслуживаться mod_wsgi . Предположим, что вы вошли на вновь созданную виртуальную машину.

1.1 Создание нового пользователя (необязательно)

Если вы создаете виртуальную машину с помощью AWS или Microsoft Azure, вы вошли в систему как пользователь, указанный вами при создании виртуальной машины, поэтому вы можете пропустить этот шаг.

Есть некоторые дополнительные шаги, если вы впервые вошли в систему как пользователь root (если вы создаете новую виртуальную машину с Digital Ocean). Хотя вы можете выполнять все функции, используя одного и того же пользователя, обычно рекомендуется создать нового пользователя. Вот подробные инструкции по созданию пользователей и добавлению их в список sudoers в Ubuntu 14.04 .

1.2 Установите менеджер пакетов Python

В этом руководстве мы собираемся использовать менеджер пакетов Ubuntu apt-get для установки пакетов. Однако на новой виртуальной машине необходимо сначала обновить пакеты, выполнив следующую команду:

 sudo apt-get update 

Pip — это менеджер пакетов Python, который помогает нам устанавливать, изменять или удалять пакеты Python. Самый простой способ установить pip в Ubuntu — использовать менеджер пакетов Ubuntu apt-get :

 sudo apt-get install python-pip 

apt-get устанавливает последнюю стабильную версию pip . Кроме того, если вам требуется конкретная версия pip , вы можете установить ее из исходного кода . Однако для развертывания приложения Django достаточно установить его через менеджер пакетов.

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

1.3 Установить Django

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

 sudo pip install Django 

Если вы хотите установить конкретную версию пакета, вы можете указать ее в команде, как показано ниже (в случае, если ваше приложение было закодировано в более старой версии Django):

 sudo pip install Django==1.5.5 

Вы также можете установить Django через менеджер пакетов apt-get . При выполнении этого шага следует соблюдать осторожность, так как apt-get может не обновляться до последней стабильной версии по сравнению с pip .

1.4 Установить и заморозить другие требования (необязательно)

Если вы развертываете существующий проект, вы можете рекурсивно запустить pip чтобы установить зависимости в проекте. Как правило, в каталоге исходных файлов проекта есть файл requirements.txt в котором содержатся пакеты, необходимые для запуска проекта:

 pip install -r requirements.txt 

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

Если вы работаете с приложением Django и хотите создать или обновить файл требований, вы можете просто запустить следующее:

 pip freeze > requirements.txt 

pip freeze печатает список установленных пакетов Python в вашей текущей среде, а > сохраняет выходные данные команды pip freeze в файл requirements.txt .

1.5 Создание приложения Hello World

Чтобы создать новый проект в Django с именем helloworld , выполните следующее:

 django-admin.py startproject helloworld 

Вы заметите, что был создан новый каталог helloworld . Измените каталог на helloworld и запустите следующее, чтобы запустить новое приложение helloapp в проекте Django:

 cd helloworld/ django-admin.py startapp helloapp 

Теперь мы можем создать образец представления, который печатает Hello World в нашем браузере. Сначала добавьте новое приложение в файл settings.py вашего проекта. Найдите INSTALLED_APPS в файле и добавьте в него имя нашего нового приложения. Это должно выглядеть примерно так:

 INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', 'helloapp' ) 

Затем мы добавляем шаблон URL в urls.py проекта. Это выглядит примерно так:

 urlpatterns = patterns('', # Examples: # url(r'^$', 'helloworld.views.home', name='home'), url(r'^', 'helloapp.views.home_view'), ) 

Это инструктирует Django искать функцию home_view пределах views.py приложения helloapp . Поэтому мы редактируем файл views.py чтобы он выглядел следующим образом:

 from django.http import HttpResponse def home_view(request): return HttpResponse('Hello World') 

Затем мы запускаем сервер разработки, выполняя следующее:

 python manage.py runserver 

Код для приложения Hello World Django доступен на GitHub .

2. Обслуживание приложения Django через Apache и mod_wsgi

Файловая структура Django Теперь, когда мы создали приложение hello world, в этом разделе рассматривается, как можно настроить различные параметры для обслуживания приложения через Apache и mod_wsgi.

2.1 Установите Apache2

Используя команду apt-get , установка Apache также является одностадийным процессом. Запустите следующую команду:

 sudo apt-get install apache2 

2.2 Установите mod_wsgi

Модуль mod_wsgi для Apache можно установить в Ubuntu 14.04 с помощью apt-get :

 sudo apt-get install libapache2-mod-wsgi 

Если вы используете Python 3 вместо Python 2, выполните следующее:

 sudo apt-get install libapache2-mod-wsgi-py3 

Вот учебник с подробными инструкциями по установке mod_wsgi в Ubuntu .

2.3 Изменение структуры каталогов

Чтобы обслуживать приложение Django через mod_wsgi , нам нужно написать сценарий WSGI, который служит связью между Apache и Django. Структура файла Django по умолчанию выглядит примерно так:

 mysite/ manage.py mysite/ __init__.py settings.py urls.py myapp/ models.py views.py 

Мы собираемся немного его изменить и добавить в mysite каталог apache содержащий три файла:

 mysite/ manage.py mysite/ __init__.py settings.py urls.py apache/ __init__.py override.py wsgi.py myapp/ models.py views.py 

Это помогает отделить логику, и вы также можете игнорировать каталог в целом в вашей системе контроля версий.

Примечание: если вы используете программное обеспечение для управления версиями (VCS), такое как Git, вы можете добавить каталог apache в список игнорируемых VCS.

2.4 Создать скрипт WSGI

Пустой файл __init__.py указывает Python обрабатывать каталог как пакет. override.py импортирует все настройки и переопределяет любые настройки для производства. Например, базы данных и параметры отладки для производства могут отличаться от параметров разработки, и вы можете отделить их от исходного кода:

 # override.py from mysite.settings import * DEBUG = True ALLOWED_HOSTS = ['www.mydomain.com', 'mydomain.com'] 

Наконец, файл wsgi.py содержит настройки WSGI. Мы предполагаем, что указанный выше корневой каталог содержится в домашнем каталоге пользователя ( /home/myuser/ ):

 #wsgi.py import os, sys # Calculate the path based on the location of the WSGI script. apache_configuration= os.path.dirname(__file__) project = os.path.dirname(apache_configuration) workspace = os.path.dirname(project) sys.path.append(workspace) sys.path.append(project) # Add the path to 3rd party django application and to django itself. sys.path.append('/home/myuser') os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.apache.override' import django.core.handlers.wsgi application = django.core.handlers.wsgi.WSGIHandler() 

Вам также нужно передать владение каталогом apache www-data пользователя Apache по умолчанию, чтобы разрешить ему доступ к каталогу:

 sudo chown www-data:www-data apache/ 

Примечание: спасибо Скотту Таггарту в комментариях за указание на то, что
Сценарий wsgi.py показанный выше, выдаст ошибку в Django 1.8 (Django 1.7 использовался для этой статьи). Как отмечает Скотт, чтобы скрипт работал с Django 1.8, последние две строки необходимо заменить на:

 from django.core.wsgi import get_wsgi_application application = get_wsgi_application() 

2.5 Настройка параметров Apache

Чтобы настроить Apache на использование сценария WSGI, вам необходимо отредактировать файл конфигурации, как показано ниже (с помощью текстового редактора, в данном случае VIM):

 sudo vi /etc/apache2/sites-enabled/000-default.conf 

Добавьте следующие строки в файл:

 <VirtualHost *:80> WSGIScriptAlias /mypath/ /home/myuser/mysite/apache/wsgi.py <Directory "/home/myuser/mysite/apache/"> Require all granted </Directory> </VirtualHost> 

Первая строка добавляет псевдоним /mypath в корень вашего веб-приложения. Ваше веб-приложение теперь будет работать на вашем домене — http://www.mydomain.com/mypath/ . Замените /mypath/ вышеуказанный на / если вы хотите, чтобы ваш домен, http://www.mydomain.com/ , напрямую указывал на приложение Django. Блок <Directory> предназначен для разрешения запросов в каталог, содержащий скрипт WSGI.

Если у вас есть собственный robots.txt и favicon, вы можете добавить псевдоним следующим образом:

 Alias /robots.txt /home/myuser/mysite/robots.txt Alias /favicon.ico /home/myuser/mysite/favicon.ico 

В каждой из приведенных выше строк первый аргумент после ключевого слова Alias обозначает шаблон URL, а второй аргумент показывает путь к файлу, который нужно обслуживать. В этом примере предполагается, что ваши файлы robots.txt и favicon.ico сохранены в каталоге mysite .

Чтобы обслуживать статические и мультимедийные файлы, вам необходимо создать их записи-псевдонимы отдельно

 Alias /media/ /home/myuser/mysite/media/ Alias /static/ /home/myuser/mysite/static/ <Directory /path/to/mysite.com/static> Require all granted </Directory> <Directory /path/to/mysite.com/media> Require all granted </Directory> 

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

 sudo service apache2 restart 

Примечание для более старых версий Apache

Для версий Apache старше 2.4 (как, например, в Ubuntu 12.04), вам необходимо заменить Require all granted Allow from all после добавления строки Order deny,allow выше.

Примечание для статических файлов, обслуживаемых пакетами Django

Некоторые пакеты Django имеют свои статические и мультимедийные файлы. В версии для разработчиков об этом позаботился Django, но он не работает таким образом при обслуживании через Apache (включая статические файлы администратора Django). Статические файлы обычно находятся в том же месте, где установлены пакеты.

Простой способ переопределить их — скопировать их статические файлы в статический каталог (и зафиксировать их), что является довольно грязным решением. Лучшим способом было бы создать псевдоним для определенного набора статических файлов, так же, как вы создали записи псевдонимов для статических и медиа-корней.

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

Вывод

В последние годы Django стал первым выбором среди многих программистов. Хотя многие обвиняют Python в том, что он работает медленно, такие сайты, как Instagram и Disqus, работающие на Django, масштабируются до миллионов пользователей. Если вам интересно, вы можете прочитать, как HackerEarth масштабировал свое основанное на Django веб-приложение, используя mod_wsgi .

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