Várias instalações de Django - Como configurar multiplex transparente através do servidor web (Lighttpd)?

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

Pergunta

Esta questão decorre da resposta a: Como é que um conjunto de várias contas com bancos de dados separados para Django em um servidor?

Eu não vi nada parecido com isso no Google ou em outros lugares (talvez eu tenho o vocabulário errado), então eu acho que a entrada poderia ser uma adição valiosa ao discurso internet.

Como se poderia configurar um servidor likeso:

  • Uma instalação do Lighttpd
  • Vários projetos Django em execução como FastCGI
  • podem ser adicionados Os projetos Django / removido à vontade, e deve não requerem a reinicialização do servidor
  • redirecionamento transparente de todos os pedidos / respostas a uma determinada instalação Django, dependendo do usuário atual

i. projetos Django dadas (com tomada FastCGI correspondente):

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

projectos O Django sendo iniciado com um (simplificado) roteiro 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

Eu quero o tráfego para http://www.example.com/ para direcionar a solicitação para o aplicação correcta Django dependendo do usuário que está logado.

Em outras palavras, http://www.example.com deve vir "ser" / tmp / bob.fcgi se Bob está logado, /tmp/joe.fcgi se Joe está logado, /tmp/sue.fcgi se sue está logado. Se ninguém está logado, ele deve redirecionar para uma página de login.

Eu contemplado um script "plexer" FastCGI demultiplexing com o seguinte algoritmo:

  1. Se o cookie $ PLEX está definido, pedido tubo para /tmp/$PLEX.fcgi

  2. Caso contrário redirecionar para a página de login (que define o cookie PLEX com base em um mapeamento para-muitos e um dos Nome de usuário => PLEX)

É claro que como uma questão de segurança $ PLEX deve ser mancha marcada, e US $ PLEX não deve dar origem a qualquer presunção de confiança.

Configuração A Lighttpd seria likeso (embora Apache, Nginx, etc. poderia ser usado apenas como facilmente):

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

Entrada e pensamentos, links úteis, e saber como implementar corretamente o plexer FastCGI todos seriam apreciados.

Obrigado.

Foi útil?

Solução

Aqui está mais ou menos como eu resolver isso:

Em lighttpd.conf

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

E correspondente 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)

Onde ACCOUNT_LIST_FILE contém um número de contas, por exemplo.

abc1
abc2
abc3

O servidor irá mapear http://example.com/abc1 para / tmp / user-socket- abc1.scgi, onde presumivelmente uma instância do Django para abc1 usuário está falando SCGI.

Deve-se, obviamente, realizar algum tipo de verificação mancha sobre os nomes de contas (I gerar estes).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top