设置反向代理来缓存图像

The*_*uhn 7 nginx cache reverse-proxy

我编写了一个快速的 Python 服务器来提供重新采样的图像。例如,一个 URL 可能看起来像http://images.domain.com/resample/100x100/9f362e1994264321.jpg. 由于重采样图像很昂贵,因此需要一个缓存层。似乎 nginx 反向代理将是一个不错的选择,这里这里似乎是开始的好地方。

然而,有一个问题。有数百万个图像,因此通过将其存储http://images.domain.com/resample/100x100/9f362e1994264321.jpg在文件系统中/home/nginx/cache/resample/100x100/9f362e1994264321.jpg(或类似的东西),最终cache/resample/100x100/会在其中包含数百万个文件,这将使文件查找效率非常低。

我在存储原始图像的同时通过将它们分布在许多子目录中来处理这个问题,例如9f/36/9f362e1994264321.jpg. 但是,我不确定如何使用 nginx 做同样的事情。我可以更改 URL 来做同样的事情,如果这是唯一的解决方案,我会这样做,但我宁愿保持 URL 尽可能漂亮。

我可以用 nginx 做到这一点吗?如果没有 nginx,我可以做其他事情吗,比如清漆?

cad*_*dmi 7

相反,谷歌一些不相关的链接,你绝对应该阅读关于ngx_http_proxy_module.html的文档。

指令proxy_cache正是您所需要的。配置应该是这样的。

http {

    # ...

    proxy_cache_path /var/www/cache levels=1:2 keys_zone=imgcache:10m max_size=1000m inactive=720m;
    proxy_temp_path /var/www/cache/tmp;

    # ...

    server {

        # ...

        location /resample {
            proxy_pass          http://bla.bla.my.backend;
            proxy_cache         imgcache;
            #proxy_cache_key    $scheme$proxy_host$request_uri;
            #proxy_cache_valid 200 302 60m;
            #proxy_cache_valid 404 10m
        }

        # ...

    }

}
Run Code Online (Sandbox Code Playgroud)

/var/www/cache文件夹中将创建两级目录结构。http://mysite.com/resample/dir/file.jpg 的缓存响应将保存为 md5proxy_cache_key值。例如,如果取消#proxy_cache_key $scheme$proxy_host$request_uri;上面的注释,响应将被缓存到文件 /var/www/cache/f/08/8db24849a311cc3314955992686d308f

因为 MD5 ("http://bla.bla.my.backend/resample/dir/file.jpg") = 8db24849a311cc3314955992686d308f 和 level=1:2 转换为 dir 结构,从最后开始计算字符,...08f --> f/08/md5value