Несколько установок Django - Как настроить прозрачный мультиплекс через веб-сервер (Lighttpd)? - PullRequest
1 голос
/ 27 ноября 2008

Этот вопрос вытекает из ответа на: Как настроить несколько учетных записей с отдельными базами данных для Django на одном сервере?

Я не видел ничего подобного ни в Google, ни где-либо еще (возможно, у меня неправильный словарь), поэтому я думаю, что ввод может быть ценным дополнением к интернет-дискурсу.

Как можно настроить сервер Likeo:

  • Одна установка Lighttpd
  • Несколько проектов Django, работающих под управлением FastCGI
  • Проекты Django могут быть добавлены / удалены по желанию, и не должны требовать перезапуска веб-сервера
  • Прозрачное перенаправление всех запросов / ответов на конкретную установку Django в зависимости от текущего пользователя

т.е. Данные проекты Django (с соответствующим сокетом FastCGI):

  • Боб (/tmp/bob.fcgi)
  • Сью (/tmp/sue.fcgi)
  • Джо (/tmp/joe.fcgi)

Проекты Django, которые запускаются с помощью (слишком упрощенного) скрипта likeso:

#!/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, если вошел в систему bob, /tmp/joe.fcgi, если в систему вошел joe, /tmp/sue.fcgi, если подать в суд авторизован. Если никто не авторизован, он должен перенаправить на страницу авторизации.

Я рассмотрел демультиплексирующий сценарий FastCGI "plexer" со следующим алгоритмом:

  1. Если установлен файл cookie $ PLEX, отправьте запрос в /tmp/$PLEX.fcgi

  2. В противном случае перенаправить на страницу входа (которая устанавливает cookie PLEX на основе сопоставления имени пользователя => PLEX с множеством к одному)

Конечно, в целях безопасности $ PLEX следует проверять на зараженность, а $ PLEX не должен вызывать никаких презумпций доверия.

Конфигурация Lighttpd будет подобной (хотя Apache, Nginx и т. Д. Могут использоваться так же легко):

fastcgi.server = ( "plexer.fcgi" =>
                           ( "localhost" =>
                             (   
                               "socket" => "/tmp/plexer.fcgi",
                               "check-local" => "disable"
                             )
                           )   
                 )

Вклад и мысли, полезные ссылки и знание того, как правильно реализовать плексер FastCGI - все это будет оценено.

Спасибо.

1 Ответ

1 голос
/ 20 апреля 2009

Вот примерно, как я решил это:

In 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.

Очевидно, что нужно выполнить какую-то проверку на зараженность имен учетных записей (я их генерирую).

...