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
本文转自 liqius 51CTO博客,原文链接:http://blog.51cto.com/szgb17/1861161,如需转载请自行联系原作者