[Twisted-web] reverse proxy with nevow
Mike Mueller
pyp at gmx.net
Fri Nov 12 01:51:15 MST 2004
At 09:57 11.11.2004 +0100, you wrote:
>Hi Mike,
>
>in just a bit I'll have to set up a reverse proxy with url rewriting. Do
>you mind to share your setup? (and can I post it on the devel list of
>OpenPortalGuard (openportalguard.sf.net))?
>
>many thanks
>-b
Here is my version.
It serves static files from subdirectories in a given directory.
The names of the subdirectories correspond to the domain names.
In the example below, this is just domain1.com but it could be more domains.
The reverse proxy part redirects all requests to domains2.com to port 8080
on the same machine.
So instead using domain2.com:8080 you can use domain2.com directly (that is
on port 80).
The source for my server on port 80 looks like this:
#twistedStaticServer.py
from twisted.web import vhost, static, server, proxy
from twisted.application import internet, service
import os
# use this path to put several subdirectories
# the name of each subdirectory is used as a domain name
vhostDir = '..\hosts'
root = vhost.NameVirtualHost()
dir = 'domain1.com'
# making all files in ..\hosts\domain1.com\ available
# as static pages, just put your html files there
root.addHost(dir, static.File(os.path.join(vhostDir, dir)))
# now the reverse proxy part
vhostName = 'domain2.com'
# there is another server listening at 8080
reverseProxy = proxy.ReverseProxyResource('localhost', 8080, '')
# just add it to root and tell that it is a reverseProxy
root.addHost(vhostName, reverseProxy)
application = service.Application('web')
sc = service.IServiceCollection(application)
site = server.Site(root)
i = internet.TCPServer(80, site)
i.setServiceParent(sc)
For this to work you have to have a directory ../hosts/domain1.com and of
course put the lines
127.0.0.1 domain1.com
127.0.0.1 domain2.com
in your /etc/hosts.
The source for the reverse proxy looks like this:
#nevowProxy.py
import random
from nevow import appserver, vhost
from twisted.application import internet, service
from nevow import rend, tags
from nevow import loaders
vResource = vhost.VHostMonsterResource()
class VHostGreeter(rend.Page):
docFactory = loaders.stan(
tags.html[
tags.head[ tags.title[ "Runnig as VHostMonsterResource" ]],
tags.body[
tags.h1(style="font-size: large")[ "This works." ]
]
])
root = VHostGreeter()
#just add child as nevow.vhost.VHostMonsterResource()
root.putChild("vhost", vResource)
application = service.Application('web-proxy')
sc = service.IServiceCollection(application)
site = appserver.NevowSite(root)
i = internet.TCPServer(8080, site)
i.setServiceParent(sc)
The server listens on port 8080 and can still be directly accessed via
domain2.com:8080.
But it also works behind the static server. In this case it means the
bowser just shows domain2.com.
That's what I wanted. You might need to adapt to your needs.
HTH,
Mike
More information about the Twisted-web
mailing list