
前端 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”值呢?
1 kwh 2022-11-01 22:11:27 +08:00 虽然我不懂,但是,我认为,nginx 应该不会盲目缓存吧?毕竟 nginx 又不知道你的文件什么时候会变。要是文件更改了,nginx 还在使用缓存岂不是罪过了? |
3 sparkssssssss 2022-11-02 09:12:30 +08:00 |