Чтобы сократить лавину вопросов по поводу WSGI и Apache, было решено дописать данный рецепт.
WSGI обработчик
WSGI обработчик - это скрипт на языке Python, который вызывается Apache и который взаимодействует с вашим приложением при обработке пользовательского запроса. Данный скрипт может располагаться где угодно на файловой системе, главное, чтобы Apache имел права на его запуск.
Теперь в корне проекта создаём файл django.wsgi
:
# -*- coding: utf-8 -*-
# импортируем модуля языка, которые используются
# в этом скрипте
import os, sys, site
# подключаем наш проект в путь python, если django.wsgi
# находится не в корне проекта, то надо указывать
# полный путь до каталога проекта
sys.path.insert(0, os.path.dirname(__file__))
# подключаем виртуальное окружение проекта
site.addsitedir('/home/httpd/env/djbookru/lib/python2.6/sitepackages')
# указываем через переменную окружения
# название модуля с конфигурацией проекта
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
# передаём управление нашему проекту
from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()
Отдельно стоит упомянуть строчку с определением виртуального окружения для проекта. В указанном каталоге находятся пакеты с внешними Django приложениями и дополнительными библиотеками языка Python, которые используются в проекте.
Пример использования в реальном проекте, интересующиеся остальное раскопают сами, остальные проспонсируют рецепт :)
Виртуальный домен на Apache
Apache может управлять множеством отдельных сайтов на одном физическом сервере. Для этого используется механизм виртуальных доменов.
Дело в том, что при запросе к сайту браузер передаёт имя домену, по которому можно точно определить к кому идёт запрос. Разберём этот момент подробнее.
Основы HTTP
Определяем IP адрес сервера на котором работает сайт:
rad@nemo:~$ nslookup djbook.ru
Server: 192.168.0.1
Address: 192.168.0.1#53
Non-authoritative answer:
Name: djbook.ru
Address: 80.93.50.94
rad@nemo:~$
Итак, на сервере с IP адресом 80.93.50.94
работает нужный сайт и там он точно не один (это я знаю).
Подключаемся к серверу и запрашиваем первую страницу:
rad@nemo:~$ telnet 80.93.50.94 80
Trying 80.93.50.94...
Connected to 80.93.50.94.
Escape character is '^]'.
GET /404 HTTP/1.1
HTTP/1.1 400 Bad Request
Server: nginx
Date: Sat, 12 Feb 2011 16:38:58 GMT
Content-Type: text/html
Content-Length: 166
Connection: close
<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>
Connection closed by foreign host.
rad@nemo:~$
Как видно из результата, нас там никто не ждёт!
Теперь укажем в запросе какой именно сайт должен нам ответить, обратите внимание на поле Host
в запросе:
rad@nemo:~$ telnet 80.93.50.94 80
Trying 80.93.50.94...
Connected to 80.93.50.94.
Escape character is '^]'.
GET /404 HTTP/1.1
Host: djbook.ru
HTTP/1.1 302 FOUND
Server: nginx
Date: Sat, 12 Feb 2011 16:38:42 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Vary: Accept-Language,Cookie
Content-Language: ru
Location: /404/
Content-Length: 0
Обратите внимание на ответ, на строку с Location
, теперь нам ответил правильный сайт. Если бы мы сделали запрос:
GET / HTTP/1.1
то нам была бы отправлена первая страница сайта (она очень большая, поэтому не использовалась в примерах).
Настройка Apache
Пример файла конфигурации Apache для создания виртуального сервера:
<VirtualHost *>
ServerName djbookru
ServerAdmin <ПОЧТА АДМИНИСТРАТОРА САЙТА>
WSGIScriptAlias <ТОЧКА ПОДКЛЮЧЕНИЯ ПРОЕКТА> <ПУТЬ ДО WSGI ОБРАБОТЧИКА>
# эти параметры не работают в Windows!
WSGIDaemonProcess djbookru processes=1 maximum-requests=1 threads=1
WSGIProcessGroup djbookru
LogLevel debug
ErrorLog /home/httpd/logs/djbookru.error.log
CustomLog /home/https/logs/djbookru.access.log combined
ServerSignature On
Alias /admin/media/ "<ПУТЬ ДО ОКРУЖЕНИЯ>/src/django/contrib/admin/media/"
Alias /static/ "<ПУТЬ ДО ПРОЕКТА>/src/static/"
# права на доступ к каталогам
<Directory "<ПУТЬ ДО ОКРУЖЕНИЯ>/src/django/contrib/admin/media">
Order allow,deny
Allow from all
</Directory>
<Directory "<ПУТЬ ДО ПРОЕКТА>/src">
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Обратите внимание на строчку с WSGIDaemonProcess
. В данном примере использована конфигурация тестового сервера, которая перечитывает файлы после каждого запроса. Работает практически также как и Django сервер.
Обратите внимание на параметр <ТОЧКА ПОДКЛЮЧЕНИЯ ПРОЕКТА>
. В большинстве случаев его значением будет /
-- корень сайта. Но никто не запрещает использовать другие значения, например /forum/
-- в этом случае ваш проект будет откликаться по URL http://вашсайт/forum/
.
Итоги
Надеюсь этот простой рецепт помог вам разобраться в настройке WSGI для вашего проекта. С вопросами прошу на форум. Комментарии к рецепту пишите здесь.