Installazioni multiple di Django - Come configurare il multiplex trasparente tramite il server web (Lighttpd)?
Domanda
Questa domanda deriva dalla risposta a: Come si configurano più account con database separati per Django su un server?
Non ho visto nulla di simile su Google o altrove (forse ho un vocabolario sbagliato), quindi penso che l'input potrebbe essere una preziosa aggiunta al discorso su Internet.
Come si può configurare un server like:
- Un'installazione di Lighttpd
- Più progetti Django eseguiti come FastCGI
- I progetti Django possono essere aggiunti / rimossi a piacimento e non devono richiedere il riavvio del server web
- Reindirizzamento trasparente di tutte le richieste / risposte a una particolare installazione di Django a seconda dell'utente corrente
vale a dire. Dati progetti Django (con socket FastCGI corrispondente):
- Bob (/tmp/bob.fcgi)
- Sue (/tmp/sue.fcgi)
- Joe (/tmp/joe.fcgi)
I progetti Django sono iniziati con uno script (semplificato) come:
#!/bin/sh
NAME=bob
SOCKET=/tmp/$NAME.fcgi
PROTO=fcgi
DAEMON=true
/django_projects/$NAME/manage.py runfcgi protocol=$PROTO socket=$SOCKET
daemonize=$DAEMON
Voglio che il traffico http://www.example.com/ indirizzi la richiesta al corretta applicazione Django a seconda dell'utente che ha effettuato l'accesso.
In altre parole, http://www.example.com dovrebbe venire " be " /tmp/bob.fcgi se bob è connesso, /tmp/joe.fcgi se joe è connesso, /tmp/sue.fcgi se è stata fatta causa. Se nessuno ha effettuato l'accesso, dovrebbe reindirizzare a un login pagina.
Ho contemplato un demultiplazione "plexer" Script FastCGI con il seguente algoritmo:
-
Se è impostato il cookie $ PLEX, inoltra la richiesta a /tmp/$PLEX.fcgi
-
Altrimenti reindirizza alla pagina di accesso (che imposta il cookie PLEX sulla base di una mappatura multipla di Username = > PLEX)
Ovviamente per sicurezza $ PLEX dovrebbe essere verificato e $ PLEX non dovrebbe dare adito a presunzione di fiducia.
Una configurazione Lighttpd sarebbe likeo (sebbene Apache, Nginx, ecc. potrebbero essere usati altrettanto facilmente):
fastcgi.server = ( "plexer.fcgi" =>
( "localhost" =>
(
"socket" => "/tmp/plexer.fcgi",
"check-local" => "disable"
)
)
)
Sarebbe molto apprezzato input e pensieri, collegamenti utili e sapere come implementare correttamente il plexer FastCGI.
Grazie.
Soluzione
Ecco come ho risolto questo problema:
In lighttpd.conf
$SERVER["socket"] == "localhost:81" {
include_shell "/opt/bin/lighttpd_conf.py"
}
E corrispondente 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)
Dove ACCOUNT_LIST_FILE contiene un numero di account, ad esempio
abc1
abc2
abc3
Il server eseguirà il mapping http://example.com/abc1 su / tmp / user-socket- abc1.scgi, dove presumibilmente un'istanza di Django per l'utente abc1 sta parlando di SCGI.
Ovviamente è necessario eseguire una sorta di controllo dei contaminanti sui nomi degli account (li ho generati).