反向代理or后端nginx 缓存生效时间

1
2
3
4
5
6
7
8
nginx - >nginx2
真正对缓存有效是在nginx2上做的
比如
location~ . * \.(gif|jpg|png|htm|html|css|js|flv|ico|swf)(. * ) {
                    expires  3m ;
              }
浏览器会显示
Cache - Control: max - age = 180
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
nginx缓存优先级(缓存问题者必看)
缓存过期的因素:
1 )inactive:在proxy_cache_path配置项中进行配置,说明某个缓存在inactive指定的时间内如果不访问,将会从缓存中删除。
2 )源服务器php页面中生成的响应头中的Expires,生成语句为:
header( "Expires: Fri, 07 Sep 2013 08:05:18 GMT" );
3 )源服务器php页面生成的 max - age,生成语句为:
header( "Cache-Control: max-age=60" );
4 )nginx的配置项 proxy_cache_valid:配置nginx cache中的缓存文件的缓存时间,如果配置项为:proxy_cache_valid  200  304  2m ;说明对于状态为 200 304 的缓存文件的缓存时间是 2 分钟,两分钟之后再访问该缓存文件时,文件会过期,从而去源服务器重新取数据。
其次对需要注意的一点:源服务器的expires和nginx cache的expires配置项的冲突进行说明
经过大量测试发现:对缓存的过期与清除起作用的因素的优先级从高到低一次为:
inactive配置项、源服务器设置的Expires、源服务器设置的 Max - Age、proxy_cache_valid配置项
 
1. 通过实例 1 和实例 2 综合分析:如果inactive已经进行了设置,则缓存的过期时间以inactive设置的值为准
 
2. 这说明源服务器端设置的Expires屏蔽了nginx的valide和源服务器端设置的 max - age的作用
 
3. 通过实例 2 和实例 3 的现象说明:如果inactive设置的比较大,在inactive到期之前,如果valid、服务器端设置的expires、服务器端设置的 max - age都进行了设置,则以服务器端设置的expires为准
 
4. #下面两行用于消除服务器端配置的Expires响应头的影响
proxy_ignore_headers  "Expires" ;
proxy_hide_header  "Expires" ;
proxy_cache_valid  1m / / 1 分钟
现象:第一次访问页面ta1.php之后,各个时间的访问结果:
1 分钟之后   HIT  / / 这说明valid的作用已经被服务器端的 max - age屏蔽
2 分钟之后   MISS / / 服务器端设置的 max - age起作用
 
5. 通过实例 5 和实例 6 的现象说明:如果inactive设置的比较大,而且在nginx配置文件中取消服务器端Expires对缓存的影响。在同时设置了proxy_cache_valid和服务器端设置了 max - age响应头字段的情况下,以服务器端设置的 max - age的值为标准进行缓存过期处理。
 
综上所述:
1 )在同时设置了源服务器端Expires、源服务器端 max - age和nginx cahe端的proxy_cache_valid的情况下,以源服务器端设置的Expires的值为标准进行缓存的过期处理
2 )若在nginx中配置了相关配置项,取消原服务器端Expires对缓存的影响,在同时设置了源服务器端Expires、源服务器端 max - age和nginx cahe端的proxy_cache_valid的情况下,以源服务器端 max - age的值为标准进行缓存的过期处理
3 )若同时取消源服务器端Expires和源服务器端 max - age对缓存的影响,则以proxy_cache_valid设置的值为标准进行缓存的过期处理
4 )   Inactive的值不受上述三个因素的影响,即第一次请求页面之后,每经过inactvie指定的时间,都要强制进行相应的缓存清理。因此inactive的优先级最高。
5 )所以对缓存过期影响的优先级进行排序为:inactvie、源服务器端Expires、源服务器端 max - age、proxy_cache_valid
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
proxy_cache_path   / data0 / proxy_cache_dir  levels = 1 : 2    keys_zone = cache_one: 200m   inactive = 5s  max_size = 30g ;
 
从上面两项可以看出nginx cache服务器中expires的配置是 30s ,该expires的值直接决定了在浏览器端看到的 max - age以及expires的值。而源服务器端的代码中设置的响应头中的 max - age为 60 ,expires为Fri,  07  Sep  2013  08 : 05 : 18  GMT。这是源服务器的设置与nginx - cache的设置冲突了,那么这两个属性应该怎么设置呢?
 
下面两行用于消除服务器端配置的Expires响应头的影响
proxy_ignore_headers  "Expires" ;
proxy_hide_header  "Expires" ;
proxy_ignore_headers  "Cache-Control"  "Expires"  "Set-Cookie" ;
 
proxy_cache cache_one;  
proxy_cache_valid  200  302  5s ;
proxy_cache_key $host$uri$is_args$args;
 
 
 
1. 如果valid 大,源服务器设置的Expires、源服务器设置的 Max - Age、proxy_cache_valid配置项
2. 如果valid 小,inactive配置项、源服务器设置的Expires、源服务器设置的 Max - Age、proxy_cache_valid配置项
 
inactive的值不受上述三个因素的影响,即第一次请求页面之后,每经过inactive指定的时间,都要强制进行相应的缓存清理。因此inactive的优先级最高
 
location~ . * \.(gif|jpg|png|htm|html|css|js|flv|ico|swf)(. * ) {
                    expires  30d ;
              }
 
location~ . * \.(gif|jpg|png|htm|html|css|js|flv|ico|swf)(. * ) {
                    expires  5s ;
 
 
把sendfile改成OFF后就好了
 
proxy_temp_path  / data / soft / temp;
#设置web缓存区名为cache_one,内存缓存空间大小为12000M,自动清除超过15天没有被访问过的缓存数据,硬盘缓存空间大小200g
proxy_cache_path  / data / soft / cache levels = 1 : 2  keys_zone = cache_one: 12000m  inactive = 15d  max_size = 200g ;
 
#如果后端的服务器返回500、502、503、504执行超时等错误、自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移
      proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
 
proxy_cache_key $uri$is_args$args;
 
/ 2013 / 08 / 15 / 38 / 382272 / shuazanzhushou_V1. 8.16_mumayi_95a91 .apk
 
/ data / nginx_temp / nginx_cache / e / dd / 361e94c566199df8484e24b8c2bc0dde
proxy_cache_key $host$uri$is_args$args;
cdn.o2osit.eascs.com / widget / baidu - webuploader / dist / webuploader.withoutimage.js?_v = 2016 - 10 - 12T08 % 3A15 % 3A06Z

附上一个具体的缓存配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
范例
proxy_cache_path  /usr/local/nginx1 .10 /proxy_cache  levels=1:2keys_zone=my-cache:100m max_size=1000m inactive=600m max_size=2g;
    #load balance Settings
proxy_cache_valid 200 304 301 3028h;
proxy_cache_valid 404 1m;
proxy_cache_valid any 1d;
proxy_cache_key$host$uri$is_args$args;
expires 30d;
 
 
自己
proxy_cache_path  /data/nginx_temp/nginx_cache  levels=1:2 keys_zone=cache_one:2048m inactive=30m max_size=60g;
proxy_cache_valid 200 304 5m;
proxy_cache_valid 301 302 5m;
proxy_cache_valid any 1m;
proxy_cache_key $host$uri$is_args$args;
expires 30m;
 
chown  -R nginx.nginx  /data/nginx_temp  权限问题要注意
 
server {
         listen  80;
         server_name     xx.com;
if  ($time_iso8601 ~  "^(d{4})-(d{2})-(d{2})T(d{2}):(d{2}):(d{2})" )
{
set  $year1 $1;
set  $month1 $2;
set  $day1 $3;
set  $hour1 $4;
set  $minutes1 $5;
set  $seconds1 $6;
}
access_log   /opt/log/cdn- $year-$month-$day.log main;
error_log    /opt/log/cdn- $year-$month-$day.error;
location ~ .*\.(gif|jpg|png|html|htm|css|js|ico|swf|pdf)(.*) {
proxy_pass http: //ip ;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_ignore_headers Set-Cookie;
proxy_hide_header Set-Cookie;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_cache cache_one;
proxy_cache_valid 200 304 15m;
proxy_cache_valid 301 302 15m;
proxy_cache_valid any 1m;
proxy_cache_key $host$uri$is_args$args;
expires 60m;  #会在respond里面看到max-age的大小的值跟这个有关
}
location / {
       proxy_pass http: //ip ;   
       proxy_redirect off;
proxy_set_header  Host $host;
proxy_set_header  X-Real-IP $remote_addr;
proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
proxy_ignore_headers Set-Cookie;
proxy_hide_header Set-Cookie;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
 
}
   location ~  /purge (/.*) {
         allow 127.0.0.1;
         allow x.0 /24 ;
         deny all;
         #proxy_cache_purge cache_one $host$1$is_args$args;
         proxy_cache_purge cache_one $host$uri$is_args$args;
     }
}
以下几个配置要注意,很有用
#    proxy_ignore_headers "Cache-Control" "Expires" "Set-Cookie";
#    proxy_cache_key $host$uri$is_args$args;
#    add_header Ten-webcache '$upstream_cache_status from $host';
 
优化建议:为了做到cache加速的同时,又不影响业务,
在缓存策略配置上最好遵循头部信息的要求,不要忽略nocache等字样强制存储,
也就是说proxy_ignore_headers指令慎用,比如一些图片验证码和一些php、jsp、asp
等动态内容在存储了后,用户多次访问会返回同样的信息,导致用户报障。
还有一类资源是没有明确生命周期缓存头的(无cache-control或expires),
也就是没有任何缓存要求,建议采用保守方式不要存储,
主要是proxy_cache_valid指令的配置,有cookie的信息nginx默认就是不存的。
对于故障信息的存储根据实际业务处理,有些故障信息是有必要存储的,
还有任何资源如果源站出问题,要设置吐过期资源给用户,
做到起码用户可以访问,保护一下源站。个别资源的缓存处理根据业务需要个别设置。


实践后发现

优先级按下图的所示

nginx(反向代理)-----nginx(web服务器)


那么真正的配置                                                                                     

1.nginx 配置proxy_cache_path,那么在代理端就会缓存,但是要location指定

  比如

1
2
3
4
5
6
7
8
9
10
11
location  / grouploan / M00 {  
         proxy_next_upstream http_502 http_504 error timeout invalid_header;  
         proxy_cache cache_one;  
         proxy_cache_valid  200  304  1h ;  
         proxy_cache_valid  301  302  30m ;  
         proxy_cache_valid  any  1m ;  
         proxy_cache_key $host$uri$is_args$args;  
         add_header eleme  '$upstream_cache_status from $host' ;  
         proxy_pass http: / / fdfs_grouploan;  
         #expires 1d; 
     }

2.后端web设置

location ~ ^/(images|javascript|js|css|flash|media|static)/ {

expires 10s;

}

3.chrome查看缓存是否hit

http://www.cnblogs.com/Dicky-Zhang/p/5963084.html?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io

就是这么简单。


最后附一张图 http://benpaozhe.blog.51cto.com/10239098/1763897

wKioL1jSEAzjgJdcAAE4nfbavqs134.png
















































本文转自 liqius 51CTO博客,原文链接:http://blog.51cto.com/szgb17/1861161,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值