2008-11-27 6 views
1

Cette question découle de la réponse à: How does one set up multiple accounts with separate databases for Django on one server?Plusieurs installations de Django - Comment configurer un multiplex transparent via le serveur web (Lighttpd)?

Je ne l'ai pas vu quelque chose comme ça sur Google ou ailleurs (peut-être que j'ai le mauvais vocabulaire), donc je pense que l'entrée pourrait être un ajout précieux au discours internet.

Comment pourrait-on configurer un serveur likeso:

  • Une installation de Lighttpd
  • multiples projets Django en cours d'exécution en tant que FastCGI
  • Les projets Django peuvent être ajoutés/supprimés à volonté, et ne doit pas exiger redémarrage du serveur Web
  • Redirection transparente de toutes les demandes/réponses vers une installation Django particulière en fonction de l'utilisateur en cours

I.e. Compte tenu des projets Django (avec prise FastCGI correspondante):

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

les projets Django en cours de démarrage avec un script (trop simpliste) 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 veux du trafic vers http://www.example.com/ pour diriger le r équivaut à l'application Django correcte en fonction de l'utilisateur qui est connecté.

En d'autres termes, http://www.example.com devrait être "ê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 doit rediriger vers une page de connexion.

J'ai contemplé un démultiplexage "Plexer" script FastCGI avec l'algorithme suivant:

  1. Si le cookie $ PLEX est réglé, demande de tuyau à /tmp/$PLEX.fcgi

  2. sinon rediriger la page de connexion (qui définit le PLEX cookie basé sur un grand nombre à un mappage du nom d'utilisateur => PLEX)

Bien sûr, comme une question de sécurité $ PLEX devrait être entacher vérifié, et $ PLEX ne devrait donner lieu à aucune présomption de confiance.

Une configuration Lighttpd serait likeso (bien que Apache, Nginx, etc. pourrait être utilisé aussi facilement):

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

entrée et pensées, liens utiles, et de savoir comment appliquer correctement les FastCGI Plexer serait tout apprécié.

Merci.

+0

Pourriez-vous préciser * pourquoi * vous voulez multiplexer en fonction de l'utilisateur? Cela semble étrange, et ça ne va certainement pas bien évoluer ... –

Répondre

1

Voilà à peu près comment je résolu ce problème:

Dans lighttpd.conf

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

Et correspondant 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) 

Où ACCOUNT_LIST_FILE contient un certain nombre de comptes, par exemple

abc1 
abc2 
abc3 

Le serveur carte http://example.com/abc1 à /tmp/user-socket-abc1.scgi, où vraisemblablement une instance de Django pour ABC1 utilisateur parle SCGI.

Il faut évidemment effectuer une sorte de taint checking sur les noms des comptes (je produis ces).

Questions connexes