Skip to content
nginx
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout 60;
    proxy_cache_path /ngx_tmp levels=1:2 keys_zone=test_cache:100m inactive=1d max_size=10g ;

    upstream httpds {
	      server 192.168.44.101:80;
    }

    server {
        listen       80;
        server_name  120.78.79.181;

        location / {
	        proxy_pass http://httpds;
            add_header  Nginx-Cache "$upstream_cache_status";
            # 缓存名是 keys_zone 的值
            proxy_cache test_cache;
            # 设置缓存有效期,过期后才向上游服务器请求资源。
            proxy_cache_valid 1h;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

第一次请求的响应头中 Nginx-Cache: MISS 之后请求的响应头中 Nginx-Cache: HIT

缓存清理

https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_purge

安装

wget https://github.com/FRiCKLE/ngx_cache_purge/archive/refs/tags/2.3.tar.gz tar -xzvf 2.3.tar.gz

cd /root/nginx-1.18.0 ./configure --prefix=/usr/local/nginx/ --add-module=/root/ngx_cache_purge-2.3/ make systemctl stop nginx cp ./objs/nginx /usr/local/nginx/sbin/ systemctl start nginx /usr/local/nginx/sbin/nginx -V

配置

nginx
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout 60;
    proxy_cache_path /ngx_tmp levels=1:2 keys_zone=test_cache:100m inactive=1d max_size=10g ;

    upstream httpds {
	    server 192.168.44.103:80;
    }

    server {
        listen       80;
        server_name  120.78.79.181;

        location ~ /purge(/.*) {
            # $1 表示请求的 uri,proxy_cache_purge 的值始终与 proxy_cache_key 
            # 保存一致。
            proxy_cache_purge test_cache $1;
            # 完整配置
            # proxy_cache_purge test_cache $scheme$proxy_host$1$is_args$args;
        }

        location / {
	        proxy_pass http://httpds;
            add_header Nginx-Cache "$upstream_cache_status";
            proxy_cache test_cache;
            proxy_cache_valid 1h;
            # proxy_cache_key 默认为 $scheme$proxy_host$request_uri,如根目录就是 
            # http://httpds/
            # 将 chache_key 设置为 uri,对于动态请求,是否设置缓存以及缓存时间需要
            # 仔细考虑。
            proxy_cache_key $uri;
            # 完整配置,$is_args$args 可以获取到参数
            # proxy_cache_key $scheme$proxy_host$uri$is_args$args;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

访问 192.168.44.101/purge/ 即可清除根目录的缓存。

断点续传

有 Content-Length 有具体值后即可断点续传,在反向代理服务器中需向后传递请求头。

proxy_set_header Range $http_range;

proxy_cache_key 中增加 range

配置项

  • proxy_cache_use_stale off;

    默认为 off,在什么时候可以使用过期缓存

    可选 error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | off

  • proxy_cache_background_update off;

    默认 off,运行开启子请求更新过期的内容,同时会把过期的内容返回给客户端。

  • proxy_no_cache / proxy_cache_bypass

    指定什么时候不使用缓存而直接请求上游服务器

    proxy_no_cache $cookie_nocache $arg_nocache$arg_comment;
    proxy_no_cache $http_pragma    $http_authorization;

    如果这些变量存在且不为空或者不等于 0,则不使用缓存。

  • proxy_cache_convert_head on;

    默认 on,是否把 head 请求转换成 get 请求后再发送给上游服务器以便缓存 响应体的内容,即不管是 head 还是 get 都要缓存内容。 如果关闭,需要在 cache_key 中添加 $request_method 以便区分缓存内容。

  • proxy_cache_lock off;

    默认 off,是否开启缓存更新锁,避免缓存覆盖。

  • proxy_cache_lock_age: 5s;

    默认 5s,缓存锁超时时间,5s 内还没更新完成,就释放锁。

  • proxy_cache_max_range_offset

    range 最大值,超过之后不做缓存,默认情况下 不需要对单文件较大的资源做缓存。

  • proxy_cache_methods

    会被缓存的方法,默认 head、get。

  • proxy_cache_min_uses

默认 1,被请求多少次之后才做缓存、

  • proxy_cache_path

    • path

      指定存储目录。

    • levels=1:3

      1:3 表示 2 层目录,第一层用 1 个字符命名,第二层用 3 个字符命名,取 md5 后几位。

    • use_temp_path

      默认创建缓存文件时,先向缓冲区创建临时文件,再移动到缓存目录。

    • inactive

      指定时间内未被访问过的缓存将被删除。

  • proxy_cache_key

    默认为 $scheme$proxy_host$request_uri,缓存的 key。

  • proxy_cache_revalidate

    如果缓存过期了,向上游服务器发送 If-Modified-Since 和 If-None-Match 来验证是否 改变,如果没有就不重新下载资源。

  • proxy_cache_valid

    针对不同 http 状态码设置缓存过期时间,不设置状态码会默认为 200, 301, 302

    nginx
    proxy_cache_valid 200 302 10m;
    proxy_cache_valid 301      1h;
    # any 指其他任意状态码
    proxy_cache_valid any      1m;