nginx缓存应用的两个条件,一种是上游资源的变化频率比较低,二是前端对上游变化的实时性要求不高,此时就可以考虑使用nginx本地缓存来处理前端请求,避免每次都重复的从上游读取相同的内容,造成上游资源的重复消耗,从而提高前端的响应效率。
1. 定义缓存
在nginx配置文件的http模块配置:
proxy_cache_path /tmp/nginx/cache levels=1:2 keys_zone=auth_cache:128m inactive=1h max_size=256m use_temp_path=off;
这里包括缓存路径,目录层次以及缓存名称,缓存大小,有效期等。
2. 配置响应缓存
到需要使用缓存的location配置:
location /test {
#internal;
proxy_cache auth_cache;
proxy_cache_valid 200 10m;
proxy_cache_valid 403 10m;
# proxy_cache_key $host$request_uri;
proxy_cache_key $host$http_x_original_uri;
proxy_cache_lock on;
proxy_cache_lock_age 5s;
add_header Cache-status $upstream_cache_status;
}
配置内容包括:
使用的缓存,针对不同的状态码配置不同的有效期,缓存的key,以及缓冲状态配置到响应中。
proxy_cache_key "$scheme$request_method$host$request_uri"
proxy_cache_key "$host$uri$is_args$args";
3. 缓存文件内容查看
找到并打开缓存文件内容:
/tmp/nginx/cache/2/54/4ef025157cc1bc58ccb3a365e0725542
^E^@^@^@^@^@^@^@¹Púf^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ÿÿÿÿÿÿÿÿaNúf^@^@^@^@"åW^N^@^@Ô^A0^B^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
KEY: 192.168.4.125/Microsoft-Server-ActiveSync?User=test001@otp.com
HTTP/1.1 403 ^M
Content-Length: 0^M
Date: Mon, 30 Sep 2024 07:08:17 GMT^M
Connection: close^M
4. 缓存工作有关指令
如果不配置proxy_buffering,NGINX是不能生产缓存的,所以我们先来分析buffering的工作原理。
buffer工作原理
首先第一个概念是所有的这些proxy buffer参数是作用到每一个请求的。每一个请求会安按照参数的配置获得自己的buffer。proxy buffer不是global而是per request的。
proxy_buffering 是为了开启response buffering of the proxied server,开启后proxy_buffers和proxy_busy_buffers_size参数才会起作用。
无论proxy_buffering是否开启,proxy_buffer_size都是工作的,proxy_buffer_size所设置的buffer_size的作用是用来存储upstream端response的header。
在proxy_buffering 开启的情况下,NGINX将会尽可能的读取所有的upstream端传输的数据到buffer,直到proxy_buffers设置的所有buffer们被写满或者数据被读取完(EOF)。此时NGINX开始向客户端传输数据,会同时传输这一整串buffer们。同时如果响应的内容很大的话,NGINX会接收并把他们写入到临时文件里去。大小由proxy_max_temp_file_size控制。如果busy的buffer传输完了会从temp_file里面接着读数据,直到传输完毕。一旦proxy_buffers设置的buffer被写入,直到buffer里面的数据被完整的传输完(传输到客户端),这个buffer将会一直处在busy状态,我们不能对这个buffer进行任何别的操作。所有处在busy状态的buffer size加起来不能超过proxy_busy_buffers_size,所以proxy_busy_buffers_size是用来控制同时传输到客户端的buffer数量的。
5. 相关指令说明
Syntax:proxy_buffering on | off;
Default:proxy_buffering on;
Context:http, server, location
启用或禁用使用缓冲区来存储代理服务器的响应。默认打开,如果proxy_buffering关闭,则NGINX不会生成缓存文件。启用后,NGINX会尽快从代理服务器收到响应,并将其保存到由指令proxy_buffer_size和proxy_buffers指令设置的缓冲区中 。如果缓冲区不能容纳整个响应,则可以将一部分响应保存到磁盘上的临时文件中。临时文件大小由 proxy_max_temp_file_size和proxy_temp_file_write_size 指令配置。指令proxy_temp_file_write_size定义的是一次访问能写入的临时文件的大小,默认是proxy_buffer_size和proxy_buffers中设置的缓冲区大小的2倍,Linux下一般是8k。指令proxy_max_temp_file_size指定当响应内容大于proxy_buffers指定的缓冲区时, 写入硬盘的临时文件的大小. 如果超过了这个值, NGINX将与Proxy服务器同步的传递内容, 而不再缓冲到硬盘. 设置为0时, 则直接关闭硬盘缓冲。
禁用后,收到响应后到就立即同步传递到客户端。NGINX不会尝试从代理服务器读取整个响应。一次可以从服务器接收的最大数据大小由proxy_buffer_size指令设置。
可以通过在“ X-Accel-Buffering”响应头字段中传递“ yes”或“ no” 来启用或禁用缓冲。也可以使用proxy_ignore_headers指令禁用此功能 。