Installazioni multiple di Django - Come configurare il multiplex trasparente tramite il server web (Lighttpd)?

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

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:

  1. Se è impostato il cookie $ PLEX, inoltra la richiesta a /tmp/$PLEX.fcgi

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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top