Mehrere Installationen von Django - Wie transparent Multiplex durch den Webserver (Lighttpd) konfigurieren?

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

Frage

Diese Frage ergibt sich aus der Antwort auf: Wie kann man mehrere Konten mit separaten Datenbanken für Django auf einem Server?

Ich habe nichts, wie dies auf Google gesehen oder an anderer Stelle (vielleicht habe ich den falschen Wortschatz), so denke ich, Eingang eine wertvolle Ergänzung zum Internet Diskurs sein könnte.

Wie kann man einen Server likeso konfigurieren:

  • Eine Installation von Lighttpd
  • Mehrere Django Projekte laufen als FastCGI
  • Die Django-Projekte können nach Belieben hinzugefügt / entfernt werden, und sollen nicht verlangen, den Webserver neu zu starten
  • Transparente Umleitung aller Anfragen / Antworten zu einer bestimmten Installation Django auf den aktuellen Benutzer je

d. Gegeben Django Projekte (mit entsprechender FastCGI-Buchse):

  • Bob (/tmp/bob.fcgi)
  • Sue (/tmp/sue.fcgi)
  • Joe (/tmp/joe.fcgi)

Die Django-Projekte gestartet wird mit einem (stark vereinfacht) Skript 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

Ich will Verkehr auf http://www.example.com/ die Anfrage an die richten korrekte Django-Anwendung auf dem Benutzer abhängig, das angemeldet ist.

Mit anderen Worten: http://www.example.com kommen sollte "" / tmp / bob.fcgi wenn bob angemeldet ist, /tmp/joe.fcgi wenn joe angemeldet ist, /tmp/sue.fcgi wenn sue angemeldet ist. wenn niemand angemeldet ist, es auf eine Anmeldeseite umleiten soll.

Ich habe einen Demultiplexen in Betracht gezogen „Plexer“ FastCGI-Skript mit dem folgenden Algorithmus:

  1. Wenn das Cookie $ PLEX gesetzt, Rohr Anfrage /tmp/$PLEX.fcgi

  2. umleiten Andernfalls zur Login-Seite (die den Cookie PLEX setzt auf der Grundlage einer von vielen zu-Eins-Abbildung von Benutzername => PLEX)

Natürlich als eine Frage der Sicherheit $ PLEX sollte taint geprüft und $ PLEX soll nicht zu einer Vermutung des Vertrauens geben.

Eine Lighttpd Konfiguration wäre likeso (obwohl Apache, Nginx, usw. verwendet nur werden könnte, wie leicht):

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

Input und Gedanken, hilfreiche Links und wissen, wie man richtig die FastCGI Plexer alle geschätzt würde implementieren.

Danke.

War es hilfreich?

Lösung

Hier ist grob, wie ich das gelöst:

In lighttpd.conf

$SERVER["socket"] == "localhost:81" {
  include_shell "/opt/bin/lighttpd_conf.py"
}

Und entsprechende 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)

Wo ACCOUNT_LIST_FILE eine Anzahl von Konten enthält, z.

abc1
abc2
abc3

Der Server Karte http://example.com/abc1 / tmp / user-Sockel- abc1.scgi, wo vermutlich eine Django-Instanz für Benutzer abc1 spricht SCGI.

Man muss offensichtlich eine Art Makel führt auf den Namen von Girokonten (I erzeugen diese).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top