在nginx反向代理的所有文件夹级别上缓存图像

时间:2015-11-13 23:13:59

标签: caching nginx proxy

我正试着为我的开源图片托管服务PictShare缓存图像。

Pictshare有一个智能查询系统,其中上传的图像可以位于"虚拟子目录中。这会改变图像。例如,这是上传的stackoverflow徽标的链接:https://www.pictshare.net/6cb55fe938.png

我可以通过在图片名称前面的网址添加/300/来将其大小调整为300宽度:https://www.pictshare.net/300/6cb55fe938.png

由于我最近处理了大量流量,我希望我的nginx代理能够从所有虚拟子文件夹中缓存所有图像,但它无法正常工作。我已经阅读了很多文章和许多stackoverflow帖子,但没有解决方案适合我。

到目前为止,这是我的高效vhost文件

proxy_cache_path /etc/nginx/cache/pictshare levels=1:2 keys_zone=pictshare:50m max_size=1000m inactive=30d;
proxy_temp_path /etc/nginx/tmp 1 2;
proxy_cache_key "$scheme$request_method$host$request_uri";

proxy_ignore_headers "Set-Cookie";
proxy_hide_header "Set-Cookie";
proxy_buffering on;

server {
...
location / {
        proxy_pass          http://otherserver/pictshare/;
        include /etc/nginx/proxy_params;

        location ~* \.(?:jpg|jpeg|gif|png|ico)$ {
          expires max;
          proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
          proxy_cache_valid 200 301 302 1y;
          proxy_cache pictshare;
          proxy_pass          http://otherserver/pictshare$request_uri;
        }

    }
}

问题是没有文件被缓存,我在代理目的地上看到每个图像请求。

我让它工作的唯一方法是在主机文件中添加一个特殊位置,该位置明确启用了缓存:

   location /cached {
       proxy_cache_valid 200 1y;
        proxy_cache pictshare;
        expires 1y;

        proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;

        include /etc/nginx/proxy_params;

        proxy_pass          http://otherserver/pictshare/thumbs/;
       proxy_cache_use_stale  error timeout invalid_header updating http_500 http_502 http_503 http_504;

        }

此解决方案的一个明显问题是,只有在请求以/cached开头时才会缓存图像,例如:https://www.pictshare.net/cached/6cb55fe938.png

将缓存命令添加到根目录对我来说是不可取的,因为我不希望缓存表单和页面,只需要图像

我的错误在哪里?

1 个答案:

答案 0 :(得分:2)

proxy_cache_path /etc/nginx/cache/pictshare levels=1:2 keys_zone=my_cache:50m max_size=3g inactive=180m;
proxy_temp_path /etc/nginx/tmp 1 2;
proxy_cache_key "$scheme$request_method$host$request_uri";

location ~* ^.+\.(jpe?g|gif|png|ico|pdf)$ {
    access_log off;
    include /etc/nginx/proxy.conf;
    proxy_pass http://backend;
    proxy_cache pictshare;
    proxy_cache_valid any 12h;
    add_header X-Proxy-Cache $upstream_cache_status;
    root /var/www/public_html/cached; }

location / {
    include /etc/nginx/proxy.conf;
    proxy_pass http://backend;
    root /var/www/public_html;
}

nginx首先搜索文字字符串给出的最具体的前缀位置,而不管列出的顺序如何。在上面的配置中,唯一的前缀位置是“/”,因为它匹配任何请求,它将被用作最后的手段。然后nginx按照配置文件中列出的顺序检查正则表达式给出的位置。第一个匹配表达式停止搜索,nginx将使用此位置。如果没有正则表达式匹配请求,则nginx使用先前找到的最具体的前缀位置。 的 http://nginx.org/en/docs/http/request_processing.html