【Nginx】05、nginx缓冲缓存设置
⼀、缓冲
在反向代理场景中,nginx有⼀系列指令可⽤于定义其⼯作特性,如缓冲区⼤⼩等,给这些指令设定⼀个合理的值,可以有效提升其性能。
nginx在默认情况下在将其响应给客户端之前会尽可能地接收来upstream服务器的响应报⽂,它会将这些响应报⽂存暂存于本地并尽量⼀次性地响应给客户端。然⽽,在来⾃于客户端的请求或来⾃upsteam服务器的响应过多时,nginx会试图将之存储于本地磁盘中,这将⼤⼤降低nginx的性能。因此,在有着更多可⽤内存的场景中,应该将⽤于暂存这些报⽂的缓冲区调⼤⾄⼀个合理的值。
1、proxy_buffer_size size
proxy_buffer_size ⽤来接受后端服务器 response 的第⼀部分,⼩的response header 通常位于这部分响应内容⾥边。默认proxy_buffer_size 被设置成 proxy_buffers ⾥⼀个buffer 的⼤⼩,当然可以设置更⼩些。
①如果 proxy_buffers 关闭
Nginx不会尝试获取到后端服务器所有响应数据之后才返回给客户端,Nginx 会尽快把数据传给客户端,在数据传完之前,Nginx 接收到的最⼤缓存⼤⼩不能超过 proxy_buffer_size 。
②如果 proxy_buffers 打开
Nginx将会尽可能的读取后端服务器的数据到buffer,直到proxy_buffers设置的所有buffer们被写满或者数据被读取完(EOF),此时Nginx开始向客户端传输数据,会同时传输这⼀整串buffer们。如果数据很⼤的话,Nginx会接收并把他们写⼊到temp_file⾥去,⼤⼩由proxy_max_temp_file_size 控制。「当数据没有完全读完的时候」,Nginx同时向客户端传送的buffer ⼤⼩不能超过 proxy_busy_buffers_size 「此句可能理解有误」。
Syntax:proxy_buffer_size size;
Default:proxy_buffer_size 4k|8k;
Context:http, server, location
2、proxy_buffering on|off
启⽤缓冲upstream服务器的响应报⽂,否则,如果proxy_max_temp_file_size指令的值为0,来⾃upst
ream服务器的响应报⽂在接收到的那⼀刻将同步发送⾄客户端;⼀般情况下,启⽤proxy_buffering并将proxy_max_temp_file_size设定为0能够启⽤缓存响应报⽂的功能,并能够避免将其缓存⾄磁盘中;
Syntax:proxy_buffering on | off;
Default:proxy_buffering on;
Context:http, server, location
proxy_buffering 开启的时候,proxy_buffers 和proxy_busy_buffers_size 才会起作⽤,⽆论proxy_buffering 是否开
启,proxy_buffer_size 都起作⽤。
3、proxy_max_temp_file_size
Syntax:proxy_max_temp_file_size size;
Default:proxy_max_temp_file_size 1024m;
Context:http, server, location
4、proxy_buffers
⽤于缓冲来⾃upstream服务器个数和⼤⼩;
Syntax:proxy_buffers number size;
Default:proxy_buffers 8 4k|8k;
Context:http, server, location
5、proxy_busy_buffers_size
Syntax:proxy_busy_buffers_size size;
Default:proxy_busy_buffers_size 8k|16k;
Context:http, server, location
6、buffer⼯作原理
1)所有的proxy buffer参数是作⽤到每⼀个请求的。每⼀个请求会安按照参数的配置获得⾃⼰的buffer。proxy buffer不是global⽽是per request的。
2) proxy_buffering 是为了开启response buffering of the proxied server,开启后proxy_buffers和
proxy_busy_buffers_size参数才会起作⽤。
3)⽆论proxy_buffering是否开启,proxy_buffer_size(main buffer)都是⼯作的,proxy_buffer_size所设置的
buffer_size的作⽤是⽤来存储upstream端response的header。
4)在proxy_buffering 开启的情况下,Nginx将会尽可能的读取所有的upstream端传输的数据到buffer,直到
proxy_buffers设置的所有buffer们被写满或者数据被读取完(EOF)。此时nginx开始向客户端传输数据,会同时传输这⼀整串buffer们。同时如果response的内容很⼤的话,Nginx会接收并把他们写⼊到temp_file⾥去。⼤⼩由
proxy_max_temp_file_size控制。如果busy的buffer 传输完了会从temp_file⾥⾯接着读数据,直到传输完毕。
5)⼀旦proxy_buffers设置的buffer被写⼊,直到buffer⾥⾯的数据被完整的传输完(传输到客户端),
这个buffer将会⼀直处在busy状态,我们不能对这个buffer进⾏任何别的操作。所有处在busy状态的buffer size加起来不能超过
proxy_busy_buffers_size,所以proxy_busy_buffers_size是⽤来控制同时传输到客户端的buffer数量的。
⼆、缓存
nginx做为反向代理时,能够将来⾃upstream的响应缓存⾄本地磁盘(也可以缓存在缓存服务器中,如memcached),并在后续的客户端请求同样内容时直接从本地构造响应报⽂。
1、proxy_cache
Syntax:proxy_cache zone | off;
nginx 配置文件
Default:proxy_cache off;
Context:http, server, location
定义⼀个⽤于缓存的共享内存区域(内存中存储的是哈希表,缓存还是存储在磁盘上,只是为了快速检索),其可被多个地⽅调⽤;
缓存将遵从upstream服务器的响应报⽂⾸部中关于缓存的设定:
如 'Expires'、'Cache-Control:no-cache'、 'Cache-Control:max-age=XXX'、'private'和'no-store' 等,但nginx在缓存时不会考虑响应报⽂的'Vary'⾸部。为了确保私有信息不被缓存,所有关于⽤户的私有信息可以upstream上通过'no-cache' or 'max-age=0'来实现,也可在nginx设定proxy_cache_key必须包含⽤户特有数据如$cookie_xxx的⽅式实现,但最后这种⽅式在公共缓存上使⽤可能会有风险。因此,
在响应报⽂中含有以下⾸部或指定标志的报⽂将不会被缓存:
Set-Cookie
Cache-Control containing 'no-cache','no-store','private',or  a  'max-age'  with a non-numeric or  0 value,Expires
with a time in the past (Expires 指定⼀个过去的时间)
X-Accel-Expires:0
2、proxy_cache_path
Syntax:proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
Default:―
Context:http
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;
proxy_cache_path定义⼀个⽤于保存缓存响应报⽂的⽬录,及⼀个保存缓存对象的键(就是proxy_cache 定义的zone)及响应元数据的共享内存区域(keys_zone=name:size),
其可选参数有:
levels:
每级⼦⽬录名称的长度,有效值为1或2,每级之间使⽤冒号分隔,最多为3级;
例如:levels=1:1:2
表⽰缓存⽬录是3层结构(最多只能有3层),1级⽬录名是1个16进制的字符(那1级⽬录就有16个),2级⽬录名1个字符并且有16个,3层⽬录名2个字符并且有256个
inactive:
⾮活动缓存项从缓存中剔除之前的最⼤缓存时长;
max_size:
缓存空间⼤⼩的上限(磁盘中的⽂件),当需要缓存的对象超出此空间限定时,缓存管理器将基于LRU算法对其进⾏清理;
loader_files:
缓存加载器(cache_loader)的每次⼯作过程最多为多少个⽂件加载元数据;
loader_sleep:
缓存加载器的每次迭代⼯作之后的睡眠时长;
loader_threashold:
缓存加载器的最⼤睡眠时长;
例如:
proxy_cache_path  /data/nginx/cache/one    levels=1      keys_zone=one:10m;
proxy_cache_path  /data/nginx/cache/two    levels=2:2    keys_zone=two:100m;
proxy_cache_path  /data/nginx/cache/three  levels=1:1:2  keys_zone=three:1000m;
3、proxy_cache_min_uses
某响应报⽂被缓存之前⾄少应该被请求的次数;
Syntax:proxy_cache_min_uses number;
Default:proxy_cache_min_uses 1;
Context:http, server, location
4、proxy_cache_use_stale
在⽆法联系到upstream服务器时的哪种情形下(如error、timeout或http_500等)让nginx使⽤本地缓存的过期的缓存对象直接响应客户端请求;
Syntax:proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 |http_503 | http_504 | http_403 | http_404 | off ...; Default:proxy_cache_use_stale off;
Context:http, server, location
5、proxy_cache_methods
为哪些请求⽅法启⽤缓存功能;
Syntax:proxy_cache_methods GET | HEAD | POST ...;
Default:proxy_cache_methods GET HEAD;
Context:http, server, location
6、proxy_cache_bypassstring
设定在哪种情形下,nginx将不从缓存中取数据;
Syntax:proxy_cache_bypass string ...;
Default:―
Context:http, server, location
例如:
proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;
proxy_cache_bypass $http_pragma $http_authorization;
7、proxy_cache_valid
⽤于为不同的响应码设定不同时长的有效缓存时长,
Syntax:proxy_cache_valid [code ...] time;
Default:―
Context:http, server, location
Sets caching time for different response codes. For example, the following directives
proxy_cache_valid 200 302 10m; proxy_cache_valid 404      1m;
set 10 minutes of caching for responses with codes 200 and 302 and 1 minute for responses with code 404.
If only caching time is specified
proxy_cache_valid 5m;
then only 200, 301, and 302 responses are cached.
In addition, the any parameter can be specified to cache any responses:
proxy_cache_valid 200 302 10m; proxy_cache_valid 301      1h; proxy_cache_valid any      1m;
8、其它不常⽤的指令
proxy_cache_key    # 很少⽤
Syntax:proxy_cache_key string;
Default:proxy_cache_key $scheme$proxy_host$request_uri;
Context:http, server, location
Defines a key for caching, for example
proxy_cache_key '$host$request_uri $cookie_user';
设定在存储及检索缓存时⽤于“键”的字符串,可以使⽤变量为其值,但使⽤不当时有可能会为同⼀个内容缓存多次;另外,将⽤户私有信息⽤于键可以避免将⽤户的私有信息返回给其它⽤户;
proxy_cache_lock    # 很少⽤
⽤此项,可在缓存未命令中阻⽌多个相同的请求同时发往upstream,其⽣效范围为worker级别;
proxy_cache_lock_timeout    # 很少⽤
proxy_cache_lock功能的锁定时长;
proxy_cache_path 的使⽤
1)先在主配置⽂件的http段定义proxy_cache_path
proxy_cache_path  /cache/nginx/  levels=1:1  keys_zone=mycache(名字):32m(⼤⼩);
# 只能在http段中定义
缓存路径(属主,属组要是nginx) 1级⼦⽬录的字符个数:2级⼦⽬录的字符个数
2)在server和location段中调⽤
proxy_cache  mycache(缓存⽬录名);
使⽤⽰例:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18http {
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=STATIC:10m inactive=24h max_size=1g;    server {
add_header X-Via $server_addr;
add_header X-Cache $upstream_cache_status;
location / {
proxy_pass          www.magedu;
proxy_set_header      Host $host;
proxy_cache          STATIC;
proxy_cache_valid      200 1d;
proxy_cache_valid          301 302 10m;
proxy_cache_valid        any 1m;
proxy_cache_use_stale  error timeout invalid_header updating
http_500 http_502 http_503 http_504;
}
}
}
proxy_cache_purge
缓存修剪⽅法,被请求的缓存将被删除,Syntax:proxy_cache_purge string ...; Default:―
Context:http, server, location

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。