Spec-Zone.ru › Django 1.8

Как использовать Django с FastCGI, SCGI или AJP

Устаревшее начиная с версии 1.7: Поддержка FastCGI устарела и будет удалена в Django 1.9.

Хотя WSGI является предпочтительной платформой развертывания для Django, многие люди используют совместное хостинг, на котором протоколы, такие как FastCGI, SCGI или AJP, являются единственно возможными вариантами.

Примечание

Этот документ в основном фокусируется на FastCGI. Другие протоколы, такие как SCGI и AJP, также поддерживаются через пакет Python flup. См. раздел Протоколы ниже для получения подробностей о SCGI и AJP.

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

Как и WSGI, FastCGI позволяет коду оставаться в памяти, что позволяет обслуживать запросы без времени запуска. В то время как, например, mod_wsgi может быть настроен встраиваемым в процесс веб-сервера Apache или в качестве отдельного демона, процесс FastCGI никогда не работает внутри процесса веб-сервера, всегда в отдельном, постоянном процессе.

Почему код выполняется в отдельном процессе?

В традиционных mod_* вариантах Apache различные языки сценариев (в первую очередь PHP, Python и Perl) интегрируются в адресное пространство вашего веб-сервера. Хотя это снижает время запуска — потому что код не нужно читать с диска для каждого запроса — это приводит к увеличению использования памяти.

Благодаря природе FastCGI, можно даже иметь процессы, которые выполняются под другой учетной записью пользователя, чем процесс веб-сервера. Это приятное преимущество в плане безопасности на совместных системах, потому что это означает, что вы можете защитить свой код от других пользователей.

Предварительное условие: flup

Прежде чем вы сможете начать использовать FastCGI с Django, вам нужно установить flup, библиотеку Python для работы с FastCGI. Версия 0.5 или новее должна работать нормально.

Запуск вашего сервера FastCGI

FastCGI работает по модели клиент-сервер, и в большинстве случаев вы будете запускать процесс FastCGI самостоятельно. Ваш веб-сервер (будь то Apache, lighttpd или другой) связывается с вашим процессом Django-FastCGI только тогда, когда серверу нужно загрузить динамическую страницу. Поскольку демон уже запущен с кодом в памяти, он может очень быстро передать ответ.

Примечание

Если вы используете систему совместного хостинга, вам, вероятно, придется использовать управляемые веб-сервером процессы FastCGI. См. раздел ниже о работе Django с управляемыми веб-сервером процессами для получения дополнительной информации.

Веб-сервер может подключиться к серверу FastCGI двумя способами: он может использовать сокет домен Unix («именованная труба» на системах Win32) или сокет TCP. Выбор зависит от ваших предпочтений; сокет TCP обычно проще из-за проблем с разрешениями.

Для запуска сервера сначала перейдите в каталог своего проекта (там, где находится ваш manage.py), а затем выполните команду runfcgi:

./manage.py runfcgi [options]

Если вы укажете help как единственный параметр после runfcgi, будет выведен список всех доступных параметров.

Вам нужно будет указать либо socket, либо protocol, либо оба host и port. Затем при настройке веб-сервера вам нужно будет указать хост/порт или сокет, который вы указали при запуске сервера FastCGI. См. примеры ниже.

Протоколы

Django поддерживает все протоколы, которые поддерживает flup, а именно fastcgi, SCGI и AJP1.3 (протокол Apache JServ, версия 1.3). Выберите предпочитаемый протокол, используя параметр protocol=<protocol_name> с ./manage.py runfcgi — где <protocol_name> может быть одним из: fcgi (по умолчанию), scgi или ajp. Например:

./manage.py runfcgi protocol=scgi

Примеры

Запуск потокового сервера на порту TCP:

./manage.py runfcgi method=threaded host=127.0.0.1 port=3033

Запуск предварительно разветвленного сервера на сокете домена Unix:

./manage.py runfcgi method=prefork socket=/home/user/mysite.sock pidfile=django.pid

Безопасность сокета

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

Запуск без демонизации (фонового запуска) процесса (хорошо подходит для отладки):

./manage.py runfcgi daemonize=false socket=/tmp/mysite.sock maxrequests=1

Остановка демона FastCGI

Если процесс работает в фоновом режиме, его легко остановить: просто нажав Ctrl-C остановит и выйдет из сервера FastCGI. Однако когда вы имеете дело с фоновыми процессами, вам нужно будет использовать команду Unix kill.

Если вы укажете параметр pidfile для runfcgi, вы можете убить работающий демон FastCGI следующим образом:

kill `cat $PIDFILE`

...где $PIDFILE — это pidfile, которое вы указали.

Для простого перезапуска демона FastCGI на Unix попробуйте этот небольшой скрипт оболочки:

#!/bin/bash

# Replace these three settings.
PROJDIR="/home/user/myproject"
PIDFILE="$PROJDIR/mysite.pid"
SOCKET="$PROJDIR/mysite.sock"

cd $PROJDIR
if [ -f $PIDFILE ]; then
    kill `cat -- $PIDFILE`
    rm -f -- $PIDFILE
fi

exec /usr/bin/env - \
  PYTHONPATH="../python:.." \
  ./manage.py runfcgi socket=$SOCKET pidfile=$PIDFILE

Настройка Apache

Для использования Django с Apache и FastCGI вам потребуется установленный и настроенный Apache с установленным и включенным mod_fastcgi. Обратитесь к документации Apache за инструкциями.

После настройки укажите Apache на ваш экземпляр Django FastCGI, отредактировав файл httpd.conf (конфигурация Apache). Вам нужно сделать два вещи:

  • Используйте директиву FastCGIExternalServer для указания расположения вашего сервера FastCGI.
  • Используйте mod_rewrite для указания URL-адресов на FastCGI, как это необходимо.

Указание расположения сервера FastCGI

Директива FastCGIExternalServer сообщает Apache, как найти ваш сервер FastCGI. Как объясняется в документации FastCGIExternalServer, вы можете указать либо socket , либо host . Вот примеры обоих:

# Connect to FastCGI via a socket / named pipe.
FastCGIExternalServer /home/user/public_html/mysite.fcgi -socket /home/user/mysite.sock

# Connect to FastCGI via a TCP host/port.
FastCGIExternalServer /home/user/public_html/mysite.fcgi -host 127.0.0.1:3033

В любом случае, файл /home/user/public_html/mysite.fcgi фактически не должен существовать. Это просто URL-адрес, используемый веб-сервером внутренне — маркер того, какие запросы по URL-адресу должны обрабатываться FastCGI. (Подробнее об этом в следующем разделе.)

Использование mod_rewrite для указания URL-адресов на FastCGI

Второй шаг — указать Apache использовать FastCGI для URL-адресов, которые соответствуют определенному шаблону. Для этого используйте модуль mod_rewrite и перепишите URL-адреса на mysite.fcgi (или то, что вы указали в директиве FastCGIExternalServer , как описано в предыдущем разделе).

В этом примере мы говорим Apache использовать FastCGI для обработки любого запроса, который не представляет собой файл в файловой системе и не начинается с /media/. Это, вероятно, самый распространенный случай, если вы используете административную часть Django:

<VirtualHost 12.34.56.78>
  ServerName example.com
  DocumentRoot /home/user/public_html
  Alias /media /home/user/python/django/contrib/admin/media
  RewriteEngine On
  RewriteRule ^/(media.*)$ /$1 [QSA,L,PT]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^/(.*)$ /mysite.fcgi/$1 [QSA,L]
</VirtualHost>

Django автоматически будет использовать пре-переписанную версию URL-адреса при построении URL-адресов с помощью тега шаблона {% url %} (и аналогичных методов).

Использование mod_fcgid как альтернативы mod_fastcgi

Другой способ обслуживания приложений через FastCGI — использование модуля Apache mod_fcgid. По сравнению с mod_fastcgi mod_fcgid обрабатывает приложения FastCGI по-другому, так как само управляет созданием процессов-работников и не предлагает чего-то вроде FastCGIExternalServer. Это означает, что конфигурация выглядит немного иначе.

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

Настройка lighttpd

lighttpd — это лёгкий веб-сервер, обычно используемый для обслуживания статических файлов. Он поддерживает FastCGI напрямую и, таким образом, является хорошим выбором для обслуживания как статических, так и динамических страниц, если ваш сайт не имеет каких-либо специфических потребностей Apache.

Убедитесь, что mod_fastcgi находится в вашем списке модулей где-то после mod_rewrite и mod_access, но не после mod_accesslog. Вероятно, вам также понадобится mod_alias для обслуживания медиа-файлов админки.

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

server.document-root = "/home/user/public_html"
fastcgi.server = (
    "/mysite.fcgi" => (
        "main" => (
            # Use host / port instead of socket for TCP fastcgi
            # "host" => "127.0.0.1",
            # "port" => 3033,
            "socket" => "/home/user/mysite.sock",
            "check-local" => "disable",
        )
    ),
)
alias.url = (
    "/media" => "/home/user/django/contrib/admin/media/",
)

url.rewrite-once = (
    "^(/media.*)$" => "$1",
    "^/favicon\.ico$" => "/media/favicon.ico",
    "^(/.*)$" => "/mysite.fcgi$1",
)

Запуск нескольких сайтов Django на одном lighttpd

lighttpd позволяет использовать «условную конфигурацию», чтобы настраивать конфигурацию для каждого хоста. Для указания нескольких сайтов FastCGI просто добавьте условный блок вокруг вашей конфигурации FastCGI для каждого сайта:

# If the hostname is 'www.example1.com'...
$HTTP["host"] == "www.example1.com" {
    server.document-root = "/foo/site1"
    fastcgi.server = (
       ...
    )
    ...
}

# If the hostname is 'www.example2.com'...
$HTTP["host"] == "www.example2.com" {
    server.document-root = "/foo/site2"
    fastcgi.server = (
       ...
    )
    ...
}

Вы также можете запускать несколько установок Django на одном сайте, просто указав несколько записей в директиве fastcgi.server. Добавьте по одному хосту FastCGI для каждого.

Настройка Cherokee

Cherokee — очень быстрый, гибкий и легко настраиваемый веб-сервер. Он поддерживает распространённые технологии: FastCGI, SCGI, PHP, CGI, SSI, TLS и SSL-шифрованные соединения, виртуальные хосты, аутентификацию, кодирование на лету, балансировку нагрузки, файлы журналов, совместимые с Apache, балансировщик базы данных, обратный HTTP-прокси и многое другое.

Проект Cherokee предоставляет документацию по настройке Django с Cherokee.

Запуск Django на сервере совместного хостинга с Apache

Многие поставщики совместного хостинга не позволяют запускать собственные демоны сервера или редактировать файл httpd.conf. В таких случаях всё ещё возможно запустить Django, используя процессы, запущенные веб-сервером.

Примечание

Если вы используете процессы, запущенные веб-сервером, как описано в этом разделе, вам не нужно запускать сервер FastCGI самостоятельно. Apache запустит необходимое количество процессов, масштабируясь по мере необходимости.

В вашем корневом каталоге веб-сервера добавьте это в файл с именем .htaccess:

AddHandler fastcgi-script .fcgi
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ mysite.fcgi/$1 [QSA,L]

Затем создайте небольшой скрипт, который укажет Apache, как запускать вашу программу FastCGI. Создайте файл mysite.fcgi и поместите его в ваш веб-каталог, а также убедитесь, что он имеет разрешение на выполнение:

#!/usr/bin/python
import sys, os

# Add a custom Python path.
sys.path.insert(0, "/home/user/python")

# Switch to the directory of your project. (Optional.)
# os.chdir("/home/user/myproject")

# Set the DJANGO_SETTINGS_MODULE environment variable.
os.environ['DJANGO_SETTINGS_MODULE'] = "myproject.settings"

from django.core.servers.fastcgi import runfastcgi
runfastcgi(method="threaded", daemonize="false")

Это работает, если ваш сервер использует модуль mod_fastcgi. Если вы используете mod_fcgid, настройка в основном такая же, за исключением небольшого изменения в файле .htaccess. Вместо добавления обработчика fastcgi-script, вы должны добавить обработчик fcgid:

AddHandler fcgid-script .fcgi
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ mysite.fcgi/$1 [QSA,L]

Перезапуск запущенного сервера

Если вы измените любой Python-код на вашем сайте, вам нужно сообщить FastCGI, что код изменился. Но в этом случае нет необходимости перезапускать Apache. Вместо этого просто загрузите mysite.fcgi, или отредактируйте файл, чтобы изменилась метка времени файла. Когда Apache увидит, что файл был обновлён, он перезапустит ваше приложение Django за вас.

Если у вас есть доступ к командной оболочке на Unix-системе, вы можете легко выполнить это, используя команду touch:

touch mysite.fcgi

Обслуживание файлов медиа-администрирования

Независимо от сервера и конфигурации, которую вы в конечном итоге выберете, вам также нужно будет подумать о том, как обслуживать файлы медиа-администрирования. Советы, данные в документации mod_wsgi, также применимы к описанным выше настройкам.

Принудительное задание префикса URL к определённому значению

Поскольку многие из этих решений на основе fastcgi требуют переписывания URL-адреса в какой-то момент внутри веб-сервера, информация о пути, которую видит Django, может не соответствовать исходному URL-адресу, который был передан. Это проблема, если приложение Django обслуживается под определённым префиксом, и вы хотите, чтобы ваши URL-адреса из тега {% url %} выглядели как префикс, а не переписанная версия, которая может содержать, например, mysite.fcgi.

Django предпринимает хорошую попытку определить, каким должен быть реальный префикс имени скрипта. В частности, если веб-сервер устанавливает SCRIPT_URL (специфично для Apache’s mod_rewrite) или REDIRECT_URL (устанавливается некоторыми серверами, включая Apache + mod_rewrite в некоторых ситуациях), Django автоматически определит исходный префикс.

В тех случаях, когда Django не может корректно определить префикс и вам нужно использовать исходное значение в URL-адресах, вы можете установить настройку FORCE_SCRIPT_NAME в вашем основном файле настроек settings. Это устанавливает имя скрипта единообразно для каждого URL-адреса, обслуживаемого через этот файл настроек. Таким образом, вам понадобятся разные файлы настроек, если вы хотите, чтобы разные наборы URL-адресов имели разные имена скриптов в этом случае, но это редкая ситуация.

В качестве примера использования, если ваша конфигурация Django обслуживает все URL-адреса под '/' и вы хотите использовать эту настройку, вы установите FORCE_SCRIPT_NAME = '' в вашем файле настроек.

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.8/howto/deployment/fastcgi/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API