V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
renothing
V2EX  ›  NGINX

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

  •  
  •   renothing · 2022-11-01 18:39:22 +08:00 · 1399 次点击
    这是一个创建于 738 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前端 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”值呢?

    3 条回复    2022-11-02 09:12:30 +08:00
    kwh
        1
    kwh  
       2022-11-01 22:11:27 +08:00
    虽然我不懂,但是,我认为,nginx 应该不会盲目缓存吧?毕竟 nginx 又不知道你的文件什么时候会变。要是文件更改了,nginx 还在使用缓存岂不是罪过了?
    renothing
        2
    renothing  
    OP
       2022-11-01 23:56:38 +08:00
    @kwh Nginx 确实就是这样缓存的。过期需要自己 purge
    coolloves
        3
    coolloves  
       2022-11-02 09:12:30 +08:00   ❤️ 1
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2758 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 139ms · UTC 13:48 · PVG 21:48 · LAX 05:48 · JFK 08:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.