如何使用ReverseProxy

2024-06-16 09:20:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下内容:

  1. 我的网络服务器在twisted上运行
  2. 我的彗星服务器,又名轨道

注意,1和2是不同的过程。在

基本上,我希望1和2共享同一个端口。请求http://mysite.com/a/b/c应该转到web服务器,以http://mysite.com/orbited/开头的任何请求都应该转到环绕的服务器,即(http://mysite.com/orbited/a/b/c=>;向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')))

目前,这项工作有效。但是,我看到有一个名为ReverseProxy Protocol的类,我已经尝试过了,修改如下:

^{pr2}$

这不管用。我在twisted的reverseProxyResource类中插入了很多指纹,我发现了以下内容:

  1. 给定http://mysite.com/orbited/a/b/c
  2. OrbitedResource将继续使用getChild调用ReverseProxyResource,直到c
  3. 当您到达c时,url已经混乱,调用轨道服务器的客户机类也将出错
  4. 我尝试在ReverseProxyResource中设置isLeaf=True,但是没有用。在

有人能给我一个更有效的方法来写这个网页吗?如果我真的需要在黑盒子里使用氧气?在


Tags: pathself服务器comloghttpinitrequest