静态文件的反向代理(隐藏上游文件名/路径)

时间:2011-07-19 00:19:27

标签: python django nginx twisted reverse-proxy

我有一组我想要提供的静态文件。它们都可以在Amazon S3存储桶中使用。但是,我不想透露S3上这些文件的实际url /路径。我只希望在任何给定时间可以使用这些文件的子集。该子集由Django应用程序动态确定。

例如,假设我有三个名为/amazon/1.jpg/amazon/2.jpg/amazon/3.jpg的文件。我不想透露他们的绝对网址。相反,我希望网址/image_a.jpg动态映射到三个图像中的一个,/image_b.jpg动态映射到另一个。

我设想的解决方案是让反向代理(nginx或扭曲)处理网址/image_a.jpgimage_b.jpg。但是,我想不出一种简单的方法可以将它们动态映射到适当的/实际的上游文件。

你能帮我提出一个可扩展的解决方案来解决这个问题吗? (我希望能够支持对这些公共URL的500多个并发访问。此外,上游源文件可能是几MB)。

感谢您的帮助!

-Advait

2 个答案:

答案 0 :(得分:2)

你可以用twisted的web服务器来做这件事,虽然不确定它会有多快。我只使用了twisted.web.wsgi.WSGIResource,所以也许这可以更简单,但只需设置这样的应用程序:

http://twistedmatrix.com/documents/10.1.0/web/howto/using-twistedweb.html#auto19

在您的应用程序中,使用environs参数中的HTTP_REFERER以您想要的任何方式映射您的URL,然后使用twisted HTTP client获取内容并将其作为对原始请求的响应进行回复。或者也许只是使用常规的python httplib如果异步的东西变得有点复杂(你必须在等待的时候阻止初始的web请求从amazon获取请求)。

或者你可以用几行代表node.js的HTTP module。创建一个HTTP服务器,然后为每个请求使用模块中的HTTP客户端请求功能来回馈从亚马逊获得的内容。

或者你可以使用mod_proxy和apache以及正则表达式和一些重写规则。

不知道你是如何用nginx做的,但如果你能用apache httpd做到这一点,你可以用nginx做。我会说使用节点或像nginx这样的网络服务器可能最有意义。

答案 1 :(得分:0)

使用nginx: 首先将proxy.conf文件添加到/etc/nginx/conf.d目录(参见辅助文件部分:http://wiki.nginx.org/FullExample) 然后为您的服务器使用类似的配置文件:

server {
    server_name mysver.com ;
    location /image_a.jog {
        proxy_pass http://$host/amazon/1.jpg ;
    }
    location /image_b.jog {
        proxy_pass http://$host/amazon/2.jpg ;
    }
}

服务器部分将使用myserver.com/image_a.jpg回复myserver.com/amazon/1.jpg,而不会泄露真实的网址。 (您可以根据需要替换$host,例如http://127.0.0.1/foo/amazon/1.jpg