2008-11-27 9 views
1

Этот вопрос вытекает из ответа на: How does one set up multiple accounts with separate databases for Django on one server?Несколько установок Django - Как настроить прозрачный мультиплекс через веб-сервер (Lighttpd)?

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

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

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

I.e. Указанные проекты Джанго (с соответствующими FastCGI сокет):

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

проекты, которые Джанго начали с (упрощенно) сценарий 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/ направить г equest к правильному приложению Django в зависимости от пользователя, который вошел в систему.

Другими словами, http://www.example.com должен быть «be» /tmp/bob.fcgi, если bob вошел в систему, /tmp/joe.fcgi, если joe is , /tmp/sue.fcgi, если sue вошел в систему. Если никто не вошел в систему, он должен перенаправить на страницу входа.

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

  1. Если печенье $ PLEX установлен, запрос трубы для /tmp/$PLEX.fcgi

  2. в противном случае перенаправление на страницу входа в систему (которая устанавливает куки PLEX, основанный на отображении многих к одному из UserName => PLEX)

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

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

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

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

спасибо.

+0

Не могли бы вы пояснить * почему * вы хотите мультиплексировать на основе пользователя? Кажется странным, и это определенно не будет хорошо масштабироваться ... – 2008-12-05 22:48:31

ответ

1

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

В 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, где предположительно экземпляр Джанго для пользователя АВС1 говорит SCGI.

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