Множественные установки Django - Как настроить прозрачный мультиплекс через веб-сервер (Lighttpd)?
Вопрос
Этот вопрос вытекает из ответа на:Как настроить несколько учетных записей с отдельными базами данных для Django на одном сервере?
Я не видел ничего подобного ни в Google, ни где-либо еще (возможно, у меня неправильный словарный запас), поэтому я думаю, что вводные данные могли бы стать ценным дополнением к интернет-дискурсу.
Как можно было бы настроить сервер подобным образом:
- Одна установка Lighttpd
- Несколько проектов Django, работающих как FastCGI
- Проекты Django могут быть добавлены / удалены по желанию и не должны требовать перезапуска веб-сервера
- Прозрачное перенаправление всех запросов / ответов на конкретную установку Django в зависимости от текущего пользователя
То есть.Данные проекты Django (с соответствующим сокетом FastCGI):
- Боб (/tmp/bob.fcgi)
- Подать в суд (/tmp/sue.fcgi)
- Джо (/tmp/joe.fcgi)
Проекты Django, запускаемые с помощью (упрощенного) скрипта, подобного:
#!/bin/sh
NAME=bob
SOCKET=/tmp/$NAME.fcgi
PROTO=fcgi
DAEMON=true
/django_projects/$NAME/manage.py runfcgi protocol=$PROTO socket=$SOCKET
daemonize=$DAEMON
Я хочу, чтобы трафик http://www.example.com/ направить запрос к правильному приложению Django в зависимости от пользователя, который вошел в систему.
Другими словами, http://www.example.com должно появиться "be" /tmp/bob.fcgi, если боб вошел в систему, /tmp/ joe.fcgi, если джо вошел в систему, /tmp/sue.fcgi, если сью вошла в систему.Если никто не вошел в систему, он должен перенаправить на страницу входа в систему.
Я рассматривал демультиплексирующий скрипт FastCGI "plexer" со следующим алгоритмом:
Если значение cookie $PLEX установлено, передайте запрос в /tmp/$PLEX.fcgi
В противном случае перенаправление на страницу входа в систему (которая устанавливает набор файлов cookie на основе сопоставления "многие к одному" Username => PLEX)
Конечно, в целях безопасности $ PLEX должен быть проверен на заражение, и $ PLEX не должен вызывать какой-либо презумпции доверия.
Конфигурация Lighttpd была бы такой (хотя Apache, Nginx и т.д.может быть использован так же легко):
fastcgi.server = ( "plexer.fcgi" =>
( "localhost" =>
(
"socket" => "/tmp/plexer.fcgi",
"check-local" => "disable"
)
)
)
Мы были бы признательны за информацию и соображения, полезные ссылки, а также за то, чтобы узнать, как правильно реализовать FastCGI plexer.
Спасибо.
Решение
Вот примерно как я решил эту проблему:
В lighttpd.conf
$SERVER["socket"] == "localhost:81" {
include_shell "/opt/bin/lighttpd_conf.py"
}
И соответствующий lighttpd_conf.py:
#!/usr/bin/python
import fileinput
ACCOUNT_LIST_FILE = "/opt/servers/account_list.txt"
for user in fileinput.input(ACCOUNT_LIST_FILE):
print """
$HTTP[\"url\"] =~ \"^/%s/\" {
scgi.server = ( \"/\" =>
(
(
\"socket\" => \"/tmp/user-socket-%s.scgi\",
\"check-local\" => \"disable\",
)
)
)
}
""" % (user, user)
Где ACCOUNT_LIST_FILE содержит несколько учетных записей, например
abc1
abc2
abc3
Сервер будет отображать http://example.com/abc1 в /tmp/user-socket-abc1.scgi, где предположительно экземпляр Django для пользователя abc1 использует SCGI.
Очевидно, что нужно выполнить какую-то проверку имен учетных записей на наличие ошибок (я их генерирую).