Múltiples instalaciones de Django: ¿Cómo configurar un multiplex transparente a través del servidor web (Lighttpd)?

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

Pregunta

Esta pregunta fluye de la respuesta a: ¿Cómo se configuran varias cuentas con bases de datos separadas para Django en un servidor?

No he visto nada como esto en Google o en otro lugar (tal vez tengo un vocabulario incorrecto), por lo que creo que la entrada podría ser una valiosa adición al discurso de Internet.

¿Cómo se puede configurar un servidor likeso?

  • Una instalación de Lighttpd
  • Múltiples proyectos de Django ejecutándose como FastCGI
  • Los proyectos de Django pueden agregarse / eliminarse a voluntad, y no debería requerir reiniciar el servidor web
  • Redirección transparente de todas las solicitudes / respuestas a una instalación particular de Django dependiendo del usuario actual

I.e. Dados proyectos de Django (con el correspondiente socket FastCGI):

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

Los proyectos de Django que se inician con un script (simplificado) me gusta:

#!/bin/sh
NAME=bob

SOCKET=/tmp/$NAME.fcgi

PROTO=fcgi
DAEMON=true

/django_projects/$NAME/manage.py runfcgi protocol=$PROTO socket=$SOCKET
  daemonize=$DAEMON

Quiero que el tráfico a http://www.example.com/ dirija la solicitud al aplicación Django correcta según el usuario que haya iniciado sesión.

En otras palabras, http://www.example.com debería venir " be " /tmp/bob.fcgi si bob está conectado, /tmp/joe.fcgi si joe está conectado, /tmp/sue.fcgi si sue está conectado. Si nadie está conectado, debe redirigirse a un inicio de sesión página.

He contemplado una demultiplexación '' plexor '' Script FastCGI con el siguiente algoritmo:

  1. Si se establece la cookie $ PLEX, canalice la solicitud a /tmp/$PLEX.fcgi

  2. De lo contrario, redirija a la página de inicio de sesión (que establece el PLEX de cookies en función de una asignación de muchos a uno de Username = > PLEX)

Por supuesto, por razones de seguridad, $ PLEX debe verificarse y $ PLEX no debe dar lugar a ninguna presunción de confianza.

Una configuración Lighttpd sería likeso (aunque Apache, Nginx, etc. podrían usarse con la misma facilidad):

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

Se agradecerán aportes y pensamientos, enlaces útiles y saber cómo implementar adecuadamente el plexor FastCGI.

Gracias.

¿Fue útil?

Solución

Aquí es más o menos cómo resolví esto:

En lighttpd.conf

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

Y correspondiente 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)

Donde ACCOUNT_LIST_FILE contiene varias cuentas, por ejemplo,

abc1
abc2
abc3

El servidor asignará http://example.com/abc1 a / tmp / user-socket- abc1.scgi, donde presumiblemente una instancia de Django para el usuario abc1 está hablando SCGI.

Obviamente, uno debe realizar algún tipo de comprobación de los nombres de las cuentas (yo las genero).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top