前端 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
coolloves 2022-11-02 09:12:30 +08:00 1
|