nginx 反向代理时怎么针对文件类型来决定缓存与否?

2022-11-01 18:39:22 +08:00
 renothing

前端 nginx 使用反向代理与我的后端一起工作,我想只缓存特定文件类型,比如图像文件, 但它似乎根本不起作用,$no_cache 总是输出默认值“proxy”,当我访问图片类文件时本应该输出“0”

map $upstream_http_content_type $no_cache {
  default proxy;
  "~*image"  0;
}
proxy_store on;
proxy_temp_path /tmp/ngx_cache;
proxy_cache_path /tmp/ngx_cache/pcache levels=1:2 use_temp_path=on keys_zone=pcache:10m inactive=14d max_size=3g;
log_format upstreamlog '$server_addr:$host:$server_port $remote_addr:$remote_port $remote_user [$time_local] '
                         '"$request" $status $request_length $body_bytes_sent [$request_time] '
                         '"$http_referer" "$http_user_agent" "$http_x_forwarded_for" - '
                        'upstream: $upstream_addr - $upstream_status - upstream_response_time: $upstream_response_time $upstream_http_content_type $skip_cache : $no_cache';

server{
.....
if ($skip_cache = false){
    set $skip_cache 0;
}
if ($no_cache = false){
    set $no_cache 0;
}
if ($request_method = POST) {
    set $skip_cache 1;
}  
if ($query_string != "") {
    set $skip_cache 1;
}  
if ($http_cache_control ~* "private") {
    set $skip_cache 1;
}  
if ($upstream_http_cache_control ~* "private") {
    set $skip_cache 1;
}

 location / {

   proxy_cache_key "$http_host$uri$is_args$args";
   proxy_cache pcache;
   add_header X-Cache-Status $upstream_cache_status;
   proxy_cache_bypass $http_pragma $http_authorization $skip_cache;
   proxy_no_cache $http_pragma $http_authorization $skip_cache $no_cache;
   proxy_pass http://$backend;
   access_log /dev/stdout upstreamlog;
 }
}

curl 测试结果

HTTP/1.1 200 OK
Server: nginx
Date: Sun, 30 Oct 2022 17:22:56 GMT
Content-Type: image/jpeg
Content-Length: 56769
Connection: keep-alive
Last-Modified: Tue, 19 Jul 2022 03:27:34 GMT
ETag: "62d624a6-ddc1"
Cache-Control: public, max-age=604800, s-maxage=1209600, stale-if-error=400
X-Cache-Status: MISS
Accept-Ranges: bytes

日志里显示输出的$no_cache始终是 proxy 为什么$upstream_http_content_type没有正确匹配到“0”值呢?

1398 次点击
所在节点    NGINX
3 条回复
kwh
2022-11-01 22:11:27 +08:00
虽然我不懂,但是,我认为,nginx 应该不会盲目缓存吧?毕竟 nginx 又不知道你的文件什么时候会变。要是文件更改了,nginx 还在使用缓存岂不是罪过了?
renothing
2022-11-01 23:56:38 +08:00
@kwh Nginx 确实就是这样缓存的。过期需要自己 purge
coolloves
2022-11-02 09:12:30 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/891858

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX