Djangoの複数のインストール-Webサーバー(Lighttpd)を介した透過的なマルチプレックスの設定方法

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

質問

この質問の答えは次のとおりです。 1台のサーバーでDjangoの個別のデータベースを使用して複数のアカウントを設定するにはどうすればよいですか

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

次のようにサーバーを構成するにはどうすればよいですか:

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

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

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

  2. それ以外の場合は、ログインページにリダイレクトします(ユーザー名=> gt; PLEXの多対1マッピングに基づいてCookie PLEXを設定します)

もちろん、セキュリティの問題として、$ PLEXを汚染チェックする必要があります。また、$ PLEXは信頼の推定を引き起こすべきではありません。

Lighttpdの設定は次のようになります(Apache、Nginxなども簡単に使用できます):

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

入力および考え、役立つリンク、およびFastCGIプレクサーを適切に実装する方法を知ることはすべて歓迎されます。

ありがとう。

役に立ちましたか?

解決

これを私がおおよそ解決した方法は次のとおりです。

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を使用しています。

明らかに、アカウントの名前に対して何らかの汚染チェックを実行する必要があります(これらを生成します)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top