Multiple installs of Django - How to configure transparent multiplex through the webserver (Lighttpd)?

This question flows from the answer to:How does one set up multiple accounts with separate databases for Django on one server?

I haven't seen anything like this on Google or elsewhere (perhaps I have the wrong vocabulary), so I think input could be a valuable addition to the internet discourse.

How could one configure a server likeso:

  • One installation of Lighttpd
  • Multiple Django projects running as FastCGI
  • The Django projects may be added/removed at will, and ought not to require restarting the webserver
  • Transparent redirection of all requests/responses to a particular Django installation depending on the current user

I.e. Given Django projects (with corresponding FastCGI socket):

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

The Django projects being started with a (oversimplified) script likeso:




/django_projects/$NAME/ runfcgi protocol=$PROTO socket=$SOCKET

I want traffic to to direct the request to the correct Django application depending on the user that is logged in.

In other words, should come "be" /tmp/bob.fcgi if bob is logged in, /tmp/joe.fcgi if joe is logged in, /tmp/sue.fcgi if sue is logged in. If no-one is logged in, it should redirect to a login page.

I've contemplated a demultiplexing "plexer" FastCGI script with the following algorithm:

  1. If the cookie $PLEX is set, pipe request to /tmp/$PLEX.fcgi

  2. Otherwise redirect to login page (which sets the cookie PLEX based on a many-to-one mapping of Username => PLEX)

Of course as a matter of security $PLEX should be taint checked, and $PLEX shouldn't give rise to any presumption of trust.

A Lighttpd configuration would be likeso (though Apache, Nginx, etc. could be used just as easily):

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

Input and thoughts, helpful links, and to know how to properly implement the FastCGI plexer would all be appreciated.

Thank you.


Here's roughly how I solved this:

In lighttpd.conf

$SERVER["socket"] == "localhost:81" {
  include_shell "/opt/bin/"

And corresponding

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)

Where ACCOUNT_LIST_FILE contains a number of accounts, e.g.


The server will map to /tmp/user-socket-abc1.scgi, where presumably a Django instance for user abc1 is talking SCGI.

One must obviously perform some sort of taint checking on the names of accounts (I generate these).

Need Your Help

How to create Facebook test user with specific profile details?

facebook facebook-graph-api

if I call Facebook API to create a new test user like this:

form-actions class similar design in twitter bootstrap 3

css twitter-bootstrap-3

We upgraded to twitter bootstrap 3 (from 2.3.2) and used .form-horizontal forms with the buttons inside .form-actions class in various places. We searched for similar design or alternatives in the ...