عمليات التثبيت المتعددة لـ Django - كيفية تكوين تعدد الإرسال الشفاف من خلال خادم الويب (Lighttpd)؟

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

سؤال

ينبع هذا السؤال من الإجابة على:كيف يمكن إعداد حسابات متعددة بقواعد بيانات منفصلة لـ Django على خادم واحد؟

لم أر شيئًا كهذا على Google أو في أي مكان آخر (ربما أمتلك مفردات خاطئة)، لذلك أعتقد أن المدخلات يمكن أن تكون إضافة قيمة إلى خطاب الإنترنت.

كيف يمكن للمرء تكوين خادم مثل ذلك:

  • تثبيت واحد لـ Lighttpd
  • مشاريع Django المتعددة تعمل كـ FastCGI
  • يمكن إضافة/إزالة مشاريع 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" /tmp/bob.fcgi إذا تم تسجيل دخول bob، و/tmp/joe.fcgi إذا تم تسجيل دخول joe، و/tmp/sue.fcgi إذا تم تسجيل دخول sue.إذا لم يقم أحد بتسجيل الدخول، فيجب إعادة التوجيه إلى صفحة تسجيل الدخول.

لقد فكرت في برنامج FastCGI لإزالة تعدد الإرسال "plexer" باستخدام الخوارزمية التالية:

  1. إذا تم تعيين ملف تعريف الارتباط $PLEX، فقم بتوجيه الطلب إلى /tmp/$PLEX.fcgi

  2. بخلاف ذلك، قم بإعادة التوجيه إلى صفحة تسجيل الدخول (التي تقوم بتعيين ملف تعريف الارتباط PLEX استنادًا إلى تعيين متعدد لاسم المستخدم => PLEX)

بالطبع من الناحية الأمنية، يجب فحص $PLEX، ولا ينبغي أن يؤدي $PLEX إلى أي افتراض للثقة.

سيكون تكوين Lighttpd كذلك (على الرغم من أن Apache وNginx وما إلى ذلك) سيكونان كذلك.يمكن استخدامها بنفس السهولة):

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

سيكون موضع تقدير المدخلات والأفكار والروابط المفيدة ومعرفة كيفية تنفيذ جهاز plexer 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، حيث من المفترض أن يكون مثيل Django للمستخدم abc1 يتحدث عن SCGI.

من الواضح أنه يجب على المرء إجراء نوع من التحقق من الأخطاء على أسماء الحسابات (أنا أقوم بإنشائها).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top