Found misprint?

Select it with the mouse and hit Enter

Ctrl-Enter
Processed:
56 1 199 25
на поддержку перевода
Яндекс Яндекс.Деньги Хочу такую же кнопку
Ускорить процесс перевода!

ЯМ:41001223475816

Редактор ресурсов Gettext для Android
The full repository of DjangoBook translation you can get on GitHub.
We appreciate your patches!
We are glad to hear your questions, comments or suggestions!
(Open in new tab)
Users number: 762
Русская группа
на Google

Apache + WSGI

Основы

Чтобы сократить лавину вопросов по поводу 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

Подробности работы с 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: http://djbook.ru/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 для вашего проекта. С вопросами прошу на форум. Комментарии к рецепту пишите здесь.

yunin7
yunin7 1 year, 3 months ago
Answer | Link

Спасибо, нужная информация )

script_kiddie
script_kiddie 1 year, 3 months ago
Answer | Link

Классный рецепт.