twisted反向代理连接已建立

2 投票
1 回答
924 浏览
提问于 2025-04-18 04:06

我正在尝试建立一个反向代理(使用twisted)。这个反向代理会监听6000到6099的端口,并将这些端口映射到不同的内部IP地址。一旦有连接到某个端口,它应该进行一些预检查,比如在一个集群中启动虚拟机。

举个例子:

PublicIP:6000 -> do pre-check -> forward traffic to InternalIP-1:6800
PublicIP:6001 -> do pre-check -> forward traffic to InternalIP-2:6800
...

我修改了一个我在这里('代理和反向代理'部分)找到的例子。但是我无法让它工作。有没有人能帮帮我?

from twisted.web import proxy, http
from twisted.internet import reactor
from twisted.python import log
import sys
log.startLogging(sys.stdout)

machines = {}

class ProxyFactory(http.HTTPFactory):
    protocol = proxy.ReverseProxy

    def connectionMade(self):
        if not machines.has_key(self.request.port): # self.request.port?!
            # start new machine in cluster 
            # machines[self.request.port] = new_machine_ip

        # reverse proxy to machines[self.request.port] on port 6800
        # return proxy.ReverseProxyResource(machines[self.request.port], 6800, '/')

for port in range(6000,6100): 
    reactor.listenTCP(port, ProxyFactory())
reactor.run()

编辑:

  • 我怎么才能获取当前请求的端口?
  • 如何将流量传递到内部IP?

1 个回答

2

Twisted实际上有一个内置的ReverseProxyResource,专门用来处理这个问题。在这个过程中,请求对象会被传递给render方法。你可以根据自己的需求对它进行扩展和修改,以实现动态路由。

详细信息请查看这里

最简单的示例在这里,不过你可以自由地重写资源方法,以进行你所描述的检查。

在这个例子中,Site是一个工厂,用来处理常规的HTTP协议。

撰写回答