Настраиваем Django 1.6 с python 3.3 под Apache2 на Ubuntu 12.04 Server

Приятного времени суток!
Возникла необходимость настроить на своём сервере с PHP под Apache поддержку Django. Думал это будет не сложно и всё пройдёт как по маслу, но получилось не совсем так. Дело в том, что я решил настроить последнюю версию фраемворка с поддержкой третьего питона. Тут то и начали всплывать подводные камни.

Основные возникшие проблемы:

  • Версия питона на Ubuntu Server 12.04 — 2.7, а мне хотелось использовать третью версию
  • Django поддерживает версию питона начиная с 3.2, в то время как mod_wsgi в стабильной версии не поддерживает версию 3.2
  • Отсутствие полного руководства для решению этих проблем

Собственно в основном из-за третьего пункта я и провозился достаточно долгое время и впоследствии решил написать эту статью.

Приступим

Сразу скажу, что я исхожу из того, что apache2 и PHP уже стоит на сервере. Мы лишь добавляем функциональность к тому, что у нас уже есть.

Для начала я для себя решил, что не плохо бы поставить самую последнюю версию питона — 3.3 (этот сервер больше для учебных целей, а учиться хочется на всём самом новом), но в Ubuntu 12.04 по умолчанию можно поставить только 3.2. Для того, чтобы добавить поддержку последней версии добавим новый репозиторий:
sudo add-apt-repository ppa:fkrull/deadsnakes
sudo apt-get update

Устанавливаем питон 3.3 и питон 3.3-dev (он нам понадобится для компиляции mod_wsgi чуть позже):
sudo apt-get install python3.3
sudo apt-get install python3.3-dev

Следующим шагом установим mod_wsgi, он нужен для связки питона и apache. Нам не подойдёт имеющийся в дистрибутиве, доступный по команде aptitude, так как он не поддерживает питон версии 3.3. Но разработчики модуля работают над этим и в репозитории уже есть необходимый код, так что нам остаётся только собрать последнюю версию из исходников и добавить при компиляции адрес до только что установленного питона:
hg clone https://code.google.com/p/modwsgi/
cd ./modwsgi/mod_wsgi
./configure --with-python=/usr/bin/python3.3
make
sudo make install

Теперь переходим к установке Django 1.6. Нам вновь не подходит установка из репозитория, так как там версия 1.3, что сильно меньше, чем 1.6 и, к тому же, не поддерживает питон 3, так что вновь устанавливаем не на прямую:
wget https://www.djangoproject.com/download/1.6/tarball/
tar xzvf index.html
cd Django-1.6
sudo python setup.py install

И так, теперь у нас есть предустановленный apache, установлен последний питон, джанго и теперь нам осталось всё это сконфигурировать. Для начала создадим папку для нашего сайта и джанго приложение:
mkdir  -p ~/public_html/domain1.com
cd ~/public_html/domain1.com
django-admin.py startproject MyProject


Создаём virtual host и WSGI файл

Создаём virtual host:
sudo nano /etc/apache2/sites-available/domain1.com

Внутри этого файла пишем:
<VirtualHost *:80>
        ServerName domain1.com
        ServerAlias www.domain1.com
        WSGIScriptAlias / /home/username/public_html/domain1.com/MyProject.wsgi
</VirtualHost>

Создаём WSGI файл:
nano ~/public_html/domain1.com/MyProject.wsgi

Записываем настройки для нашего сайта:
import os
import sys	
sys.path.append('~/public_html/domain1.com/')
os.environ['DJANGO_SETTINGS_MODULE'] = 'MyProject.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()


Настройка апача

Теперь нужно отредактировать файл httpd.conf:
sudo nano /etc/apache2/httpd.conf

Пишем в него:
LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so

WSGIScriptAlias / /home/username/public_html/domain1.com/MyProject/MyProject/wsgi.py
WSGIPythonPath /home/username/public_html/domain1.com/MyProject

<Directory /home/username/public_html/domain1.com>
<Files wsgi.py>
Order deny,allow
Require all granted
</Files>
</Directory>

Почти готово

Включаем virtual host, перезагружаем апач:
sudo a2ensite domain1.com
sudo service apache2 restart

Сейчас ваш новый сайт должен запуститься и радостно вам сообщить, что: «It worked!», и: «Of course, you haven't actually done any work yet. Next, start your first app by running python manage.py startapp [appname].».

Вот и всё! Надеюсь у вас это получится гораздо быстрее, чем получилось у меня. Приятного кодинга!
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 10

    +7
    Прошу прощения за резкость, но только мне показалось что статья ниочем?
      0
      Может быть, но когда я это делал по написанным мануалам ничего не работало и приходилось очень долго читать логи апача и гуглить, чтобы понять что на этот раз не так. Я просто хотел дать инструкцию для других, что бы они не тратили своё время там, где его уже потратил я.
        +2
        Вы молодец, что разобрались и запустили, но подобных статей — валом и их всё равно никто не читает. Я так говорю, потому что в каждой статье в комметариях талдычать про virtualenv, про pip, но всё равно, каждый раз, «с помощью configure && make && make install любой дистрибутив превращается в слакварь».
          0
          Простите за безграмотность, но сейчас действительно нет времени гуглить, как с помощью virtualenv и pip можно установить mod_wsgi из исходников? А нам это нужно (и об этом в статье написано), так как тот, который есть в репозитории не поддерживает python 3.2+ и гугление подсказывает (это не единственная ссылка, из за которой я принялся за компиляцию), что только компиляция из исходников может нам помочь.
          Всё, что я нашёл в гугле, это как с помощью virtualenv и pip поставить джангу, но пост был не об этом.
            0
            Я не большой спец в дебиане, но логика подсказывает, что если вам нужен bleeding edge, то наверное не стоит связываться со stable дистрибутивами. Потому что, например, в убунте 13.10 uwsgi-plugin вроде бы
            поддерживает python 3.3
            pavel@laptop ~ $ apt-cache depends uwsgi-plugin-python3 
            uwsgi-plugin-python3
              Depends: libc6
              Depends: libpython3.3
              Depends: uwsgi-core
              Suggests: python3-uwsgidecorators
              Conflicts: uwsgi-plugin-python3:i386
            pavel@laptop ~ $ apt-cache policy uwsgi-plugin-python3
            uwsgi-plugin-python3:
              Installed: (none)
              Candidate: 1.2.3+dfsg-5build3
              Version table:
                 1.2.3+dfsg-5build3 0
                    500 http://archive.ubuntu.com/ubuntu/ raring/universe amd64 Packages
            


            Соответственно, можно попробовать поставить этот пакет из raring репозитория.
              0
              На всякий случай, очередной how-to «Как поставить в убунте пакет из другого репозитария».
              1. У нас есть Ubuntu LTS (на момент написания это 12.04 precise) и мы хотим поставить пару пакетов из современного репозитария (на момент написания это saucy). В нашем случае, в репозитарии есть uwsgi-core версии 1.0, мы хотим минимум 1.6.
              2. Добавляем репозитарий
                /etc/apt/sources.list.d/saucy.list
                deb http://ru.archive.ubuntu.com/ubuntu saucy main universe
              3. Понижаем его приоритет до минимума
                /etc/apt/preferences.d/saucy_pin
                Package: *
                Pin: release n=saucy
                Pin-Priority: -10
              4. Обновляем кэш репозиториев
                root@host:/tmp# aptitude update
              5. Устанавливаем uwsgi-сервер и плагин питона
                Скрытый текст
                root@host:/tmp# aptitude install -t saucy uwsgi uwsgi-plugin-python
                The following NEW packages will be installed:
                  sqlite3{a} uwsgi uwsgi-core{a} uwsgi-plugin-python 
                0 packages upgraded, 4 newly installed, 0 to remove and 328 not upgraded.
                Need to get 0 B/557 kB of archives. After unpacking 1 750 kB will be used.
                Do you want to continue? [Y/n/?] 
                Selecting previously unselected package sqlite3.
                (Reading database ... 25902 files and directories currently installed.)
                Unpacking sqlite3 (from .../sqlite3_3.7.17-1ubuntu1_i386.deb) ...
                Selecting previously unselected package uwsgi-core.
                Unpacking uwsgi-core (from .../uwsgi-core_1.9.13-4build1_i386.deb) ...
                Selecting previously unselected package uwsgi.
                Unpacking uwsgi (from .../uwsgi_1.9.13-4build1_i386.deb) ...
                Selecting previously unselected package uwsgi-plugin-python.
                Unpacking uwsgi-plugin-python (from .../uwsgi-plugin-python_1.9.13-4build1_i386.deb) ...
                Processing triggers for man-db ...
                Processing triggers for ureadahead ...
                Setting up sqlite3 (3.7.17-1ubuntu1) ...
                Setting up uwsgi-core (1.9.13-4build1) ...
                Setting up uwsgi (1.9.13-4build1) ...
                 * Starting app server(s) uwsgi                                             [ OK ] 
                Setting up uwsgi-plugin-python (1.9.13-4build1) ...
              6. Проверяем, что получилось
                root@host:/tmp# uwsgi --version
                1.9.13-debian
      +4
      Крайне неудобный вариант развертывания для «потестировать». Ну ладно хоть python не из исходников собирали.

      Лучше ведь на nginx + uwsgi/gunicorn развернуть их хотя бы руками перезагружать при каждом чихе не придется.

      А еще пакеты в python принято устанавливать через pip и желательно в virtualenv
        –2
        Крайне неудобный вариант развертывания для «потестировать». Ну ладно хоть python не из исходников собирали.
        Лучше ведь на nginx + uwsgi/gunicorn развернуть их хотя бы руками перезагружать при каждом чихе не придется.

        У меня уже был сервер на Apache с PHP и когда я начинал всё это дело я и представить не мог на сколько это всё затянется, а потом уже хотелось довести дело до конца :)
          +2
          Сервер с apache и php никак не мешает описанной мной (наиболее часто используемой) схеме. Более того nginx часто ставят даже перед апачом в качестве кеширующего и раздающего статику — он это делает эффективнее апапча.
        +3
        Ставить через setup.py это моветон.
        Ставить питоновские пакеты в «системный» питон — еще хуже.

        Для этого есть virtualenv и pip.

        Only users with full accounts can post comments. Log in, please.