前言

当Nginx作为反向代理服务器的同时可以作为缓存服务器,用户请求的静态资源缓存到反代服务器上,可以加速访问。因为反代服务器不需要再到上游服务器获取数据,且缓存的存放方式为key:value方式,key保存再内存中,value为url进行hash后的值
依赖的模块为:

ngx_http_cache_modlue

一、实现方式

(1)在http配置段中定义缓存

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];

例如:定义一个名为mycache的缓存(大小为32m),缓存的文件保存在/opt/nginx_cache

proxy_cache_path /opt/nginx_cache levels=1:1 keys_zone=mycache:32m

创建缓存存放目录:

~]# mkdir -pv /opt/nginx_cache
~]# chown -R nginx:nginx /opt/nginx_cache

其中levels和keys_zone必须存在,指定的目录需要存在且属组和属主和Nginx运行用户/组相同
levels=1:1  #表示缓存的一级子目录字符为一个,二级子目录也为一个;1:2表示一级子目录为一个字符,二级子目录为两个字符;最大三个子目录。如: 1:2:3(数字表示的是目录的字符个数,而不是几级子目录)
keys_zone=name:size #指定cache的名称和大小

(2)在serverlocation中调用cache

location / {
    proxy_cache mycache;    #调用刚刚定义的缓存
    proxy_cache_valid 200 1d;   #响应码为200的缓存一天(只为演示,生产环境中不可这样)
    proxy_cache_valid 301 302 10m;  #响应码为301 302的缓存十分钟
    proxy_cache_valid any  1m;  #其他的只缓存1m
    proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;     #上游服务器故障后(以上错误、超时、500、503、502...),就使用过期的缓存
    proxy_pass http://172.16.10.120;
    proxy_set_header Host   $host;
    proxy_set_header X-Real-IP $remote_addr;
}

同时注意事项:

二、测试

将会在/opt/nginx_cache下生成缓存文件;如图

三、补充

proxy_cache_methods   GET|POST|HEAD|POST;   #对客户端那种请求方式缓存,默认为GET和HEAD,所以一般不用定义
proxy_cache_min_uses number;    #某一个响应报文,响应多少次才缓存 默认为1.对于繁忙的服务建议为5(响应五次才缓存)
proxy_cache_purge string ...;   #清除缓存 (还有点不明白怎么用)
proxy_cache_revalidate on | off;    #是否做内容更改校验,反代向上游服务器请求询问资源是否改变,没改变就更新缓存的时间,使缓存继续生效
proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | off ...;   #是否使用过期的缓存响应请求,(为什么要用过期的缓存响应,因为上游服务器宕机或者无法访问)
proxy_cache_valid [code ...] time;  #自定义缓存时间(对于一些图像是不容易改变的时候)
proxy_cache_valid 200 302 10m; #响应码为200或302的缓存10分钟
    proxy_cache_valid 404      1m;  #响应码为404的缓存1分钟
proxy_cache CACHE_NAME; #在server中定义使用那个cache
proxy_connect_timeout   #定义用于与代理服务器建立连接的超时。请注意,此超时通常不能超过75秒。
proxy_hide_header   #proxy响应给客户端时隐藏指定的首部
proxy_read_timeout #    一般不做设定,定义用于从上游服务器读取响应的超时。超时仅在两次连续的读取操作之间设置,而不用于传输整个响应。如果代理服务器在此时间内未传输任何内容,则连接将关闭。
proxy_pass_request_body on | off;   #指示是否将原始请求正文传递到上游服务器。
proxy_pass_request_headers on | off;   #指示是否将原始请求的标头字段传递到代理服务器。
proxy_buffers number size;  #缓存,暂存上游服务器的报文,多少个一起发送(个人理解)
    proxy_buffers 8 4k | 8k;

重要的一个指令:
proxy_cache_bypass string;设置在那种情形下nginx将不从cache取数据;
例如:$cookie_nocache $arg_nocahe $http_authorization (分别是:有cookie的不缓存,参数标识不缓存的,报文中有认证信息的不缓存)

以上为对缓存的补充,留个笔记
nginx反向代理的实现,如下


每天进步一点点!
END
Last modification:October 10th, 2019 at 08:27 pm
If you think my article is useful to you, please feel free to appreciate