Запуск Django через Apache и mod_wsgi в Debian / Ubuntu.

Предполагаем apache2 уже установлен, а мы хотим запустить под ним Django. А еще нам нужно чтобы наш проект использовал vitrualenv.

Существует несколько популярных модулей для апача, через которые можно запускать питоновский код: mod_wsgi, mod_fastcgi, mod_fcgi и mod_python. Последний уже много лет как не поддерживается, и имеет много других недостатков. Разница между первыми тремя для нашей цели не принципиальна. Я в данном случае я выбрал mod_wsgi.

Прежде всего нужно установить mod_wsgi.

sudo apt-get install libapache2-mod-wsgi

После чего неплохо бы перезапустить Apache.

sudo /etc/init.d/apache2 restart

В домашней директории сайта (на хостингах это обычно папка www) нужно создать два файла .htaccess и django.wsgi со следующим содержимым.

.htaccess

AddHandler wsgi-script .wsgi
Options +ExecCGI
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ django.wsgi/$1 [QSA,PT,L]

django.wsgi

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys, os

# если вы не используете virtualenv, то следующие три строки не нужны
virtual_env = '/home/user/example.com/python/' 
activate_this = os.path.join(virtual_env, 'bin/activate_this.py')
execfile(activate_this, dict(__file__=activate_this))

sys.path.insert(0, '/home/user/example.com')
sys.path.insert(0, '/home/user/example.com/myproject')

os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

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

Файл django.wsgi по сути — это обычный спкипт на питоне, из этого следует две вещи:

1. У него должны быть права на исполнение:

chmod +x django.wsgi

2. Чтобы убедиться, что файл работает можно его запустить:

./django.wsgi

Еще замечу, что более правильно расположить django.wsgi в папке cgi-bin (в этом случае подправьте путь в .htaccess).

Собственно все должно работать, если нет смотрите логи апача.

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

touch django.wsgi

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

Открываем конфиг виртуального хоста /etc/apache2/sites-available/example.com и вписываем туда две строки:

WSGIDaemonProcess app processes=2 threads=4
WSGIProcessGroup app

app — название приложения, остальные параметы смотрите в документации.

С этими строками конфиг виртуального хоста будет выглядеть как-то так:

    ServerName example.com
    ServerAlias www.example.com
    ...
    WSGIDaemonProcess app processes=2 threads=4
    WSGIProcessGroup app

Пожалуй все. Удачного деплоя!