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

发布于 2024-11-25 11:03:10 字数 595 浏览 0 评论 0原文

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

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

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

你们能帮我想出一个可扩展的解决方案来解决这个问题吗? (我希望这些公共URL能够支持500+并发访问。而且,上游源文件可能有几MB)。

感谢您的帮助!

-阿德瓦特

I've got a set of static files I want to serve. They're all available in an Amazon S3 bucket. However, I don't want to reveal the actual url/path of those files on S3. I only want a subset of those files to be available at any given time. The subset is determined dynamically by a Django application.

For example, let's say I have three files named /amazon/1.jpg, /amazon/2.jpg, and /amazon/3.jpg. I don't want to reveal their absolute URLs whatsoever. Instead I want the URL /image_a.jpg to dynamically map to one of the three images and /image_b.jpg to dynamically map to another.

My envisioned solution is to have a reverse proxy (nginx or twisted) handle the URLs /image_a.jpg and image_b.jpg. However, I can't think of an easy way to dynamically map them to the appropriate/actual upstream file.

Can you guys help me come up with a scalable solution to this problem? (I want to be able to support 500+ concurrent accesses to these public URLs. Moreover, the upstream source files might be several MB).

Thanks for your help!

-Advait

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

淡淡绿茶香 2024-12-02 11:03:10

您可以使用twisted 的网络服务器来做到这一点,尽管不确定它有多快。我只使用了twisted.web.wsgi.WSGIResource,所以也许这可以做得更简单,但只需设置一个像这样的应用程序:

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

在您的应用程序中,使用environs参数中的HTTP_REFERER映射您的URL任何你想要的方式,然后使用 扭曲的 HTTP 客户端 来获取内容并将其作为对原始请求的响应返回。或者,如果异步内容变得有点复杂,则可能只使用常规的 python httplib(您必须在等待从亚马逊获取请求时阻止初始 Web 请求)。

或者您可以使用node.js的HTTP模块在几行中完成此操作。创建一个 HTTP 服务器,然后对于每个请求,使用模块中的 HTTP 客户端请求功能来返回您从亚马逊获得的内容。

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

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

You could do this with twisted's web server, although not sure how fast it would be. I've only used the twisted.web.wsgi.WSGIResource, so maybe this can be done simpler, but just set up an app like this:

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

And in your application, using the HTTP_REFERER in the environs argument map your URL any way you want and then use the twisted HTTP client to grab the content and serve it back as a response to the original request. Or maybe just use the regular python httplib if the async stuff gets a little complicated (you have to block the initial web request while waiting go grab the request from amazon).

Or you could do this with node.js's HTTP module in a few lines. Create an HTTP server and then for each request use the HTTP client request features in the module to serve back what you get from amazon.

Or you could use mod_proxy with apache and a regular expression and some rewrite rules.

Don't know how you'd do it with nginx, but if you can do it with apache httpd you can probably do it with nginx. I'd say going with node or a webserver like nginx probably makes the most sense.

断肠人 2024-12-02 11:03:10

使用 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/amazon/1.jpg 回答 myserver.com/image_a.jpg ,而不透露真实的信息网址。 (您可以将 $host 替换为您想要的内容,例如 http://127.0.0.1/foo/amazon/1.jpg

With nginx:
start by adding the proxy.conf file to you /etc/nginx/conf.d directory (see auxilliary file section: http://wiki.nginx.org/FullExample)
Then use a similar configuration file for your server:

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 ;
    }
}

The server section will answer myserver.com/image_a.jpg with myserver.com/amazon/1.jpg without revealing the real url. (you can replace $host by what ever you want e.g. http://127.0.0.1/foo/amazon/1.jpg

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文