2008-11-27 28 views
1

这个问题从答案流向:How does one set up multiple accounts with separate databases for Django on one server?多次安装Django - 如何通过网络服务器(Lighttpd)配置透明Multiplex?

我还没有见过这样的事情在谷歌或其他地方(也许我错了词汇),所以我觉得输入可以是一个有价值的除了互联网话语。

一个人怎么能配置likeso服务器:

  • 一个Lighttpd的安装
  • 多个Django项目运行的FastCGI的
  • Django的项目可以添加/随意删除,不应该要求重新启动网络服务器
  • 根据当前用户将所有请求/响应透明地重定向到特定的Django安装

I.e.鉴于Django的项目(具有相应的FastCGI插座):

  • 鲍勃(/tmp/bob.fcgi)
  • 苏(/tmp/sue.fcgi)
  • 乔(/tmp/joe.fcgi)

Django的项目正在启动了(简单化)脚本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 

我想流量http://www.example.com/直接将R eQUEST的取决于已登录用户的正确的Django应用程序。

换句话说,http://www.example.com应该来“是” /tmp/bob.fcgi如果Bob已登录,/tmp/joe.fcgi如果joe是如果sue登录,则登录/tmp/sue.fcgi。如果没有人登录,则应该重定向到登录页面。

我设想的解复用 “路器” 以下算法FastCGI的脚本:

  1. 如果cookie $ PLEX设置,管请求/tmp/$PLEX.fcgi

  2. 否则重定向到登录页面(这将基于用户名=> PLEX的一个多到一的映射饼干PLEX)

当然作为安全$ PLEX的问题应该是污点检查,$ PLEX不应引起任何推定信任。

一个lighttpd的配置将被likeso(虽然阿帕奇,Nginx的,等等,也可以很容易地进行使用):

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

输入和想法,有用的链接,并知道如何正确实施的FastCGI路器都将不胜感激。

谢谢。

+0

你能否澄清*为什么*你想根据用户进行复用?这看起来很奇怪,而且它绝对不会很好地扩展...... – 2008-12-05 22:48:31

回答

1

这里大概我是如何解决这个:

在lighttpd.conf

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

和相应的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) 

凡ACCOUNT_LIST_FILE包含了一些帐户,例如

abc1 
abc2 
abc3 

服务器将映射到http://example.com/abc1 /tmp/user-socket-abc1.scgi,其中大概为用户ABC1一个Django实例说话SCGI。

显然,必须对账户名称(我生成这些)进行某种细微的检查。