【问题标题】:Caching images on all folder levels of nginx reverse proxy在 nginx 反向代理的所有文件夹级别缓存图像
【发布时间】:2015-11-13 23:13:58
【问题描述】:

我正在努力为我的开源图像托管服务 PictShare 缓存图像。

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

我可以通过将/300/ 添加到图像名称前的 URL 来将其调整为 300 宽度:https://www.pictshare.net/300/6cb55fe938.png

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

到目前为止,这是我的高效虚拟主机文件

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

将缓存命令添加到根目录不是我的选择,因为我不希望缓存表单和页面,只缓存图像

我的错误在哪里?

【问题讨论】:

    标签: caching nginx proxy


    【解决方案1】:
    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

    【讨论】:

    • 我们是人类,如果你写两行来解释 OP 代码中的错误以及为什么你应该工作,那不是更好吗?
    • 评论...不是没有人有时间这样做:)
    • 谢谢,但这个配置也给了我一个错误“nginx:[emerg]“proxy_pass”不能在正则表达式给出的位置有URI部分”似乎问题是我代理的服务器位于子目录中,因此我无法应用 proxy_pass 命令。我已经尝试过重写的解决方法,但也没有用
    • 这是过时的,无法让它工作。例如,我不知道include /etc/nginx/proxy.conf; 做了什么,它不再随 nginx 一起提供
    猜你喜欢
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    相关资源
    最近更新 更多