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

2 投票
2 回答
1445 浏览
提问于 2025-04-16 21:48

我有一组静态文件想要提供服务。这些文件都存放在一个亚马逊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 个回答

-1

使用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

2

你可以用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这样的网络服务器可能是最合理的选择。

撰写回答