静态文件的反向代理(隐藏上游文件名/路径)
我有一组静态文件想要提供服务。这些文件都存放在一个亚马逊S3的存储桶里。不过,我不想让别人知道这些文件在S3上的真实网址或路径。我只想在某个时间段内让一部分文件可用,而这部分文件是由一个Django应用动态决定的。
举个例子,我有三个文件,分别叫做 /amazon/1.jpg
、/amazon/2.jpg
和 /amazon/3.jpg
。我不想让别人知道它们的绝对网址。相反,我希望网址 /image_a.jpg
动态地指向这三张图片中的一张,而 /image_b.jpg
则动态地指向另一张。
我想出的解决办法是使用一个反向代理(比如nginx或twisted)来处理 /image_a.jpg
和 /image_b.jpg
这两个网址。不过,我想不出一个简单的方法来动态地将它们映射到合适的实际文件上。
你们能帮我想出一个可扩展的解决方案吗?(我希望能支持500个以上的同时访问这些公共网址。此外,源文件可能有好几MB。)
谢谢你们的帮助!
-Advait
2 个回答
使用nginx时,首先需要在你的 /etc/nginx/conf.d 目录下添加一个名为 proxy.conf 的文件(可以参考辅助文件部分: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
)
你可以用Twisted的网络服务器来实现这个功能,不过我不太确定速度会怎么样。我只用过twisted.web.wsgi.WSGIResource,所以可能有更简单的方法。你可以像这样设置一个应用:
http://twistedmatrix.com/documents/10.1.0/web/howto/using-twistedweb.html#auto19
在你的应用中,利用HTTP_REFERER这个参数,你可以随意映射你的URL,然后使用Twisted的HTTP客户端来获取内容,并把它作为响应返回给最初的请求。或者,如果异步的东西有点复杂,你也可以直接用普通的Python httplib(因为你需要在等待从亚马逊获取请求时阻塞最初的网络请求)。
另外,你也可以用Node.js的HTTP模块来实现,代码会少很多。创建一个HTTP服务器,然后对每个请求使用模块里的HTTP客户端请求功能,把从亚马逊获取的内容返回给用户。
或者你可以用Apache的mod_proxy,结合正则表达式和一些重写规则来实现。
我不太清楚怎么用nginx来做,但如果你能用Apache httpd做到,应该也能用nginx实现。我觉得用Node或像nginx这样的网络服务器可能是最合理的选择。