我正在尝试构建一个反向代理(带有扭曲)。反向代理侦听端口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
...
我修改了一个我找到here (section 'Proxies and reverse proxies')的例子。但我无法让它发挥作用。有人可以帮忙吗?
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()
修改
答案 0 :(得分:2)
Twisted实际上有一个内置的ReverseProxyResource
用于此目的,其中请求对象被传递给render
方法。可以对其进行扩展和修改,以根据需要进行动态路由。
https://twistedmatrix.com/documents/current/api/twisted.web.proxy.ReverseProxyResource.html
simplest example is here,但您可以自由覆盖资源方法来执行您描述的检查。
此示例中的 Site
是使用常规HTTP协议的工厂。