1

这个问题从答案流向:如何在一台服务器上为 Django 设置多个具有不同数据库的帐户?

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

怎么能像这样配置服务器:

  • 一种 Lighttpd 的安装
  • 作为 FastCGI 运行的多个 Django 项目
  • django项目可以随意添加/删除,不需要重启webserver
  • 根据当前用户将所有请求/响应透明重定向到特定 Django 安装

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

  • 鲍勃 (/tmp/bob.fcgi)
  • 苏 (/tmp/sue.fcgi)
  • 乔 (/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 应用程序。

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

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

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

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

当然,出于安全考虑,应该对 $PLEX 进行污点检查,并且 $PLEX 不应引起任何信任假设。

Lighttpd 配置会是这样(尽管 Apache、Nginx 等也可以很容易地使用):

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

输入和想法、有用的链接以及知道如何正确实现 FastCGI plexer 将不胜感激。

谢谢你。

4

1 回答 1

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。

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

于 2009-04-20T17:41:01.837 回答