Appearance
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|offproxy_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
nginxproxy_cache_valid 200 302 10m; proxy_cache_valid 301 1h; # any 指其他任意状态码 proxy_cache_valid any 1m;