我正试着为我的开源图片托管服务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
将缓存命令添加到根目录对我来说是不可取的,因为我不希望缓存表单和页面,只需要图像
我的错误在哪里?
答案 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 强>