我如何使用反向代理协议

时间:2010-10-17 08:01:28

标签: python twisted

我有以下内容:

  1. 我的网络服务器在扭曲的
  2. 上运行
  3. 我的彗星服务器,又叫orbited
  4. 请注意,1和2是不同的过程。

    基本上,我希望1和2共享同一个端口。 http://mysite.com/a/b/c的请求应该转到网络服务器,任何以http://mysite.com/orbited/开头的内容都应该转到轨道服务器,即(http://mysite.com/orbited/a/b/c => do请求http://mysite.com:12345/a/b/c并返回该内容。

    这就是我现在所拥有的:

    # Reverse Proxy
    class OrbitedResource(Resource):
        isLeaf = True
    
        def __init__(self, orbited_url='http://127.0.0.1:12345'):
            self.orbited = orbited_url
            Resource.__init__(self)
    
        def render_GET(self, request):
    
            def callback(html):
                request.write(html)
                request.finish()
    
            def errback(failure, *args):
                request.setResponseCode(http.INTERNAL_SERVER_ERROR)
                request.write(failure.getErrorMessage())
                request.finish()
    
            request.setHeader('Connection', 'close')
    
            # TODO find cleaner way to do this:
            # Currently request.uri is "/orbited/....", you must trim it
            target_uri = request.uri.replace('/orbited', '') 
            final_uri = self.orbited + target_uri
            print "final_uri is", final_uri
    
            deferred = getPage(final_uri)
            deferred.addCallbacks(callback, errback)
            return server.NOT_DONE_YET
    
    
    class SimpleRoutingResource(Resource):
        isLeaf = False
    
        def __init__(self, wsgiApp):
            Resource.__init__(self)
            self.WSGIApp = wsgiApp
            self.orbitedResource = OrbitedResource()
    
        def getChild(self, name, request):
            if name == "orbited":
                request.prepath.pop()
                print "Simple request.path is", request.path
                return self.orbitedResource
            else: 
                request.prepath.pop()
                request.postpath.insert(0,name)
                return self.WSGIApp
    
    # Attaching proxy + django 
    log_dir = './.log'
    if not os.path.exists(log_dir):
        os.makedirs(log_dir)
    reactor.listenTCP(DJANGO_PORT, server.Site(SimpleRoutingResource(WSGIRoot), 
            logPath=os.path.join(log_dir, '.django.log')))
    

    目前有效。但是,我看到有一个名为ReverseProxyProtocol的类,我一直在尝试使用以下修改:

    class SimpleRoutingResource(Resource):
        isLeaf = False
    
        def __init__(self, wsgiApp):
            Resource.__init__(self)
            self.WSGIApp = wsgiApp
    
        def getChild(self, name, request):
            if name == "orbited":
                request.prepath.pop()
                print "Simple request.path is", request.path, name
                return ReverseProxyResource( 'http://localhost', 12345, name )
            else: 
                request.prepath.pop()
                request.postpath.insert(0,name)
                return self.WSGIApp
    

    这不起作用。我在twisted的reverseProxyResource类中插入了很多打印件,我发现了以下内容:

    1. 鉴于http://mysite.com/orbited/a/b/c
    2. OrbitedResource将继续使用getChild调用ReverseProxyResource,直到c
    3. 当你到达c时,url搞砸了,并且调用orbited服务器的客户端类将是错误的
    4. 我尝试在ReverseProxyResource中设置isLeaf = True,但无济于事。
    5. 任何人都可以指出一种更有效的方式来编写getPage吗?如果它本质上是一个黑盒子,我真的需要使用ReverseProxyResource吗?

1 个答案:

答案 0 :(得分:0)

最干净的方法是将nginx之类的东西放在两台服务器前面。