0

我有 django 应用程序,我的文件托管在该应用程序上,Amazon s3并且站点位于Ec2.

现在我的 BW 成本很高,因为从 S3 下载了太多数据。

现在在数字海洋中,我可以以 10 美元的价格获得可用 BW2TB的服务器。

我不想移动服务器,所以我正在考虑一些我不确定是否有效的设置。

我希望当用户单击下载文件时,该请求应该转到或可能在同一服务器上,该服务器首先检查文件是否在 DG 服务器上可用some serviceDigital ocean如果文件存在,则 DG 应提供文件以供下载,如果文件不存在,则将AWS S3提供文件,然后将其复制到 DG 服务器,以便下一个请求将来自 DG 海洋服务器。所以我打算在那里使用 20GB 或更多空间来保存最常用的文件。

是否可以进行这样的设置,或者有更好的方法来完成我想要的

我的网站是Django Python

4

1 回答 1

0

这取决于您的具体需求,但我认为这里最简单的解决方案是使用带缓存的反向代理

这 - 当然 - 仅适用于您在亚马逊上拥有主要文件并将您的DG服务器视为非持久存储的情况。

Nginx 在这里非常简单,并且可能足够强大。所以我会在你的情况下尝试:

(假设有人正在访问该文件http://satic.your-site.com/image/example.jpg

  • DG“静态”请求,由服务器上的 Nginx 处理
  • Nginx 将检查内容是否在其缓存中
  • 如果是,则直接从 nginx 缓存传递响应
  • 如果没有,Nginx 会从上游服务器加载响应

这有很多优点,而且非常灵活。例如,如果您做了很多更改并想要使缓存无效,只需清空相应的目录(可能还有 HUP 服务器)。

简单的 nginx 配置示例:

proxy_cache_path  /var/lib/nginx/cache  levels=1:2   keys_zone=yoursite_cache:256m  max_size=5G;

upstream yoursite_upstream {
    server your-instance.s3.amazon.com:80 weight=1 fail_timeout=120s;
    # works as well with multiple backends. just for reference, as not needed with s3
    # server your-instance-2.s3.amazon.com:80 weight=1 fail_timeout=120s;
}


server {
    listen   *:80;
    server_name satic.your-site.com;
    access_log  /var/log/nginx/satic.your-site.com.access.log;
    error_log  /var/log/nginx/satic.your-site.com.error.log info;

    add_header X-Cache-Status;

    location / {
        proxy_ignore_headers "Set-Cookie";
        proxy_read_timeout 600;
        proxy_cache_valid  200 302  1440m;
        proxy_cache_valid  404  1m;
        proxy_cache yoursite_cache;

        proxy_pass http://yoursite_upstream;
    }
}
于 2014-03-15T09:52:46.880 回答