如何在django中的不同主机上创建缓存服务器

时间:2014-03-15 04:56:21

标签: python django amazon-web-services amazon-s3 digital-ocean

我有django应用,我的文件托管在Amazon s3,网站位于Ec2

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

现在在Digital ocean,我可以获得10美元的服务器,其中BW 2TB是可用的。

我不想转移服务器,所以我想到一些我不确定是否有效的设置。

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

这样设置是否可行,或者有更好的方法来实现我想要的东西

我的网站是Django Python

1 个答案:

答案 0 :(得分:0)

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

此课程 - 仅适用于您在亚马逊上拥有文件并将DG服务器视为非持久存储空间的情况。

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

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

  • '静态'请求,由Nginx在DG服务器
  • 上处理
  • 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;
    }
}