1

この質問は、答えから次へと流れます: 1 つのサーバー上で Django 用に別々のデータベースを持つ複数のアカウントをどのように設定しますか?

このようなものは Google や他の場所で見たことがありません (おそらく私の語彙が間違っているのでしょう) ので、入力はインターネットの言説への価値ある追加になると思います。

次のようにサーバーを構成する方法は次のとおりです。

  • Lighttpd の 1 つのインストール
  • FastCGI として実行される複数の Django プロジェクト
  • Django プロジェクトは自由に追加/削除でき、Web サーバーを再起動する必要はありません。
  • 現在のユーザーに応じて、特定の 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は、bob がログインしている場合は /tmp/bob.fcgi、joe がログインしている場合は /tmp/joe.fcgi、sue の場合は /tmp/sue.fcgi となります。誰もログインしていない場合は、ログイン ページにリダイレクトする必要があります。

次のアルゴリズムを使用して、逆多重化「プレクサー」FastCGI スクリプトを検討しました。

  1. Cookie $PLEX が設定されている場合、要求を /tmp/$PLEX.fcgi にパイプします。

  2. それ以外の場合は、ログイン ページにリダイレクトします (ユーザー名 => PLEX の多対 1 マッピングに基づいて 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 に答える