Installations multiples de Django - Comment configurer un multiplex transparent via le serveur Web (Lighttpd)?
Question
Cette question découle de la réponse à: Comment configurer plusieurs comptes avec des bases de données distinctes pour Django sur un serveur?
Je n'ai jamais rien vu de tel sur Google ou ailleurs (peut-être que j'ai un mauvais vocabulaire), donc je pense que les entrées pourraient constituer un ajout précieux au discours sur Internet.
Comment peut-on configurer un serveur comme suit:
- Une installation de Lighttpd
- Plusieurs projets Django s'exécutant en tant que FastCGI
- Les projets Django peuvent être ajoutés / supprimés à volonté et ne nécessitent pas le redémarrage du serveur Web
- Redirection transparente de toutes les demandes / réponses vers une installation Django particulière en fonction de l'utilisateur actuel
I.e. Projets Django donnés (avec le socket FastCGI correspondant):
- Bob (/tmp/bob.fcgi)
- Sue (/tmp/sue.fcgi)
- Joe (/tmp/joe.fcgi)
Les projets Django démarrés avec un script (trop simplifié) 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
Je souhaite que le trafic soit http://www.example.com/ pour diriger la demande vers le application Django correcte en fonction de l'utilisateur connecté.
En d'autres termes, http://www.example.com devrait venir " être " /tmp/bob.fcgi si bob est connecté, /tmp/joe.fcgi si joe est connecté, /tmp/sue.fcgi si sue est connecté. Si personne n'est connecté, il devrait être redirigé vers un identifiant page.
J'ai envisagé un démultiplexage " plexer " Script FastCGI avec l'algorithme suivant:
-
Si le cookie $ PLEX est défini, transmettez la demande au fichier /tmp/$PLEX.fcgi
-
Sinon, redirigez vers la page de connexion (qui définit le cookie PLEX en fonction d'un mappage plusieurs-à-un de Username =
)
Bien sûr, pour des raisons de sécurité, $ PLEX doit être vérifié, et $ PLEX ne doit donner lieu à aucune présomption de confiance.
Une configuration Lighttpd serait comme bien (bien qu'Apache, Nginx, etc. puissent être utilisés aussi facilement):
fastcgi.server = ( "plexer.fcgi" =>
( "localhost" =>
(
"socket" => "/tmp/plexer.fcgi",
"check-local" => "disable"
)
)
)
Des suggestions, des liens utiles et la bonne mise en œuvre du plexeur FastCGI seraient les bienvenus.
Merci.
La solution
Voici comment j'ai résolu ce problème:
Dans lighttpd.conf
$SERVER["socket"] == "localhost:81" {
include_shell "/opt/bin/lighttpd_conf.py"
}
Et lighttpd_conf.py correspondant:
#!/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)
Où ACCOUNT_LIST_FILE contient un certain nombre de comptes, par exemple.
abc1
abc2
abc3
Le serveur mappera http://example.com/abc1 vers / tmp / user-socket- abc1.scgi, où vraisemblablement une instance Django pour l'utilisateur abc1 parle de SCGI.
Il faut évidemment effectuer une sorte de vérification des noms des comptes (je les génère).