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

标签 python development-environment reverse-proxy

到目前为止,我使用不同的 webapp 服务器(Tornado、Django 等)进行开发,并且一次又一次地遇到同样的问题:

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

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

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

代理的速度不是问题,问题在于开发的灵 active 和速度!

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

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

最佳答案

只要不让它在端口 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()

关于python - 多源服务器简单开发http-proxy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28707160/

相关文章:

http - 我是否应该始终为 Web 应用程序使用反向代理?

Python:选择字段 "Not a valid choice"

python - 从单词列表中计算元音并将数字作为列表返回

python - 在 Pandas 数据框 python 中寻找值(value)

android - 安装并运行 - Android 上的 OpenGL ES 3.0

java - 在反向代理后面需要 HTTPS 和 Spring Security

python 从内核日志中读取最后三行

flask - Python-dotenv 无法解析从第 2 行开始的语句

java - 如何维护开发环境中心的基本文件,同时允许人们更改其本地副本

https 后面的 Apache 目录尾随斜杠问题