Installations multiples de Django - Comment configurer un multiplex transparent via le serveur Web (Lighttpd)?

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

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:

  1. Si le cookie $ PLEX est défini, transmettez la demande au fichier /tmp/$PLEX.fcgi

  2. 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.

Était-ce utile?

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).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top