简单开发多个源服务器的http-proxy

时间:2015-02-24 21:58:46

标签: python development-environment reverse-proxy

我用不同的webapp服务器(Tornado,Django,......)开发到现在,我一次又一次地遇到同样的问题:

我想要一个允许我的简单Web代理(反向代理),我可以将来自其他Web服务器的不同源实体(可以是静态文件,来自应用服务器或其他内容的动态内容)组合到一组服务文件。这意味着,浏览器应该将它们视为来自一个来源。

我知道,我可以用nginx做到这一点,但我正在寻找一种更简单的开发工具。我想要的东西,可以在命令行启动,不需要以root身份运行。更改配置(请求的路由)应尽可能简单。

在开发中,我只想能够混搭不同的来源。例如:在我的生产服务器上运行一些我不想复制的东西,但我希望连接不同服务器上的静态文件以及我的开发系统上的新应用程序。

代理的速度不是问题,只是灵活性和发展速度!

首选的是Python或其他脚本解决方案。我发现了一个很大的Python代理列表,但在扫描列表后,我发现所有内容都缺乏。他们中的大多数只是连接到一个目标服务器而无法拥有多个服务器(代理必须通过分析本地URL来决定采用哪个服务器)。

我只是想知道,没有其他人有这种需要......

3 个答案:

答案 0 :(得分:2)

只要您不让它在端口80上提供服务,就不需要以root用户身份启动nginx。如果您希望它作为普通用户在端口80上运行use setcap。结合在nginx配置文件和反向代理的路由规范之间进行转换的脚本,这应该为您提供最可靠的解决方案。

如果你想要更简单/更小的东西,使用Python的BaseHTTPServerurllib编写脚本应该非常简单。以下是仅实现GET的示例,您必须至少将其扩展到POST并添加一些异常处理:

#!/usr/bin/env python
# encoding: utf-8

import BaseHTTPServer
import SocketServer
import urllib
import re

FORWARD_LIST = {
    '/google/(.*)': r'http://www.google.com/%s',
    '/so/(.*)': r'http://www.stackoverflow.com/%s',
}

class HTTPServer(BaseHTTPServer.HTTPServer, SocketServer.ThreadingMixIn):
    pass

class ProxyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def do_GET(self):
        for pattern, url in FORWARD_LIST.items():
            match = re.search(pattern, self.path)
            if match:
                url = url % match.groups()
                break
        else:
            self.send_error(404)
            return
        dataobj = urllib.urlopen(url)
        data = dataobj.read()
        self.send_response(200)
        self.send_header("Content-Length", len(data))
        for key, value in dataobj.info().items():
            self.send_header(key, value)
        self.end_headers()
        self.wfile.write(data)

HTTPServer(("", 1234), ProxyHandler).serve_forever()

答案 1 :(得分:1)

您的使用案例应涵盖在: https://mitmproxy.org/doc/features/reverseproxy.html

答案 2 :(得分:1)

现在有一个代理可以满足我的需求(以及更多) - 非常轻量级且非常好:

Devd