FAQ

Page Discussion Edit History

TurboGearsProxy

[edit] Proxying and Load-Balancing with TurboGears

Proxying to TurboGears is pretty straightforward and is probably your best solution for this framework (rather than FastCGI).

There are two basic approaches, both of which are covered below.

[edit] Simple Proxying Example

The TurboGears Setup

Edit your prod.cfg (or dev.cfg) file and set the following options:

server.socket_host="127.0.0.1"
server.socket_port=8000

Restart TurboGears.

The Nginx Configuration

Edit your nginx.conf and add the following:

server {
  listen 80;
  server_name www.domain.com;
  location / {
    proxy_pass http://localhost:8000;
  }
}

Restart Nginx and test.

[edit] Load-Balancing Example

Setting up load balancing is not much more complicated than simple proxying. The main issue is maintaining separate dev.cfg/prod.cfg files for each instance of TurboGears. Hopefully this will have a simpler solution at some point in the future.

Since we want to have multiple TurboGears backends, we need to have a separate configuration file for each one. Make as many copies of your config file (dev.cfg or prod.cfg) as you plan on having backends and name them appropriately.

For example, to have 3 backends, you'd do this on a Unix-like OS:

cp prod.cfg prod1.cfg
cp prod.cfg prod2.cfg
cp prod.cfg prod3.cfg

Next edit each of these files and put them on a separate port or interface:

server.socket_host="127.0.0.1"
server.socket_port=8001
server.socket_host="127.0.0.1"
server.socket_port=8002
server.socket_host="127.0.0.1"
server.socket_port=8003

Now you must stop any running instances of your TurboGears application and startup the three backends:

./start-project.py prod1.cfg&
./start-project.py prod2.cfg&
./start-project.py prod3.cfg&

If anything doesn't work at this point, stop and fix it as you won't have any success from this point on if the three backends aren't functioning correctly.

The Nginx Configuration

Next we must tell Nginx about our three instances and form them into a cluster:

upstream tgcluster {
  server 127.0.0.1:8001;
  server 127.0.0.1:8002;
  server 127.0.0.1:8003;
}
 
server {
  listen 80;
  server_name www.domain.com;
  location / {
    proxy_pass http://tgcluster;
  }
}

Restart Nginx and you should be set.

As a side note, another possibility that you can currently use (and probably should) is to move much of your common TurboGears configuration into project/config/config.py and keep only the required differences in your dev.cfg/prod.cfg files. You still need to maintain separate files but you can cut them down to the bare minimum which will help keep things managable.