Множественные установки Django - Как настроить прозрачный мультиплекс через веб-сервер (Lighttpd)?

StackOverflow https://stackoverflow.com/questions/322694

Вопрос

Этот вопрос вытекает из ответа на:Как настроить несколько учетных записей с отдельными базами данных для 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" со следующим алгоритмом:

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

  2. В противном случае перенаправление на страницу входа в систему (которая устанавливает набор файлов 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.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top