多次安装Django - 如何通过Web服务器(Lighttpd)配置透明Multiplex?

时间:2008-11-27 01:21:00

标签: django webserver fastcgi lighttpd flup

这个问题从答案流向:How does one set up multiple accounts with separate databases for Django on one server?

我在谷歌或其他地方没有看到这样的事情(也许我的词汇量不对),所以我认为输入可能是互联网话语的一个有价值的补充。

如何配置服务器likeo:

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

即。给定Django项目(带有相应的FastCGI套接字):

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

Django项目以一个(过度简化的)脚本开始,喜欢:

#!/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/将请求定向到正确的Django应用程序,具体取决于登录的用户。

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

我已经考虑使用以下算法解复用“plexer”FastCGI脚本:

  1. 如果设置了Cookie $ PLEX,请将管道请求发送到/tmp/$PLEX.fcgi

  2. 否则重定向到登录页面(根据用户名=> PLEX的多对一映射设置Cookie PLEX)

  3. 当然,为了安全起见,应该对PLEX进行污点检查,而且PLEX不应该引起任何信任推定。

    Lighttpd配置会比较喜欢(尽管Apache,Nginx等可以轻松使用):

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

    输入和想法,有用的链接以及如何正确实现FastCGI plexer都将受到赞赏。

    谢谢。

1 个答案:

答案 0 :(得分: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进行对话。

显然必须对帐户名称进行某种污点检查(我生成这些)。