反向代理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,如需转载请自行联系原作者

相关文章
|
5月前
|
缓存 负载均衡 应用服务中间件
Nginx缓存的相关知识
总的来说,Nginx的缓存机制是其高性能的重要保证之一,通过合理的配置和管理,可以使网站的访问速度得到大幅提升。
132 28
|
10月前
|
负载均衡 监控 应用服务中间件
配置Nginx反向代理时如何指定后端服务器的权重?
配置Nginx反向代理时如何指定后端服务器的权重?
451 61
|
10月前
|
安全 应用服务中间件 网络安全
如何测试Nginx反向代理实现SSL加密访问的配置是否正确?
如何测试Nginx反向代理实现SSL加密访问的配置是否正确?
577 60
|
10月前
|
安全 应用服务中间件 网络安全
配置Nginx反向代理实现SSL加密访问的步骤是什么?
我们可以成功地配置 Nginx 反向代理实现 SSL 加密访问,为用户提供更安全、可靠的网络服务。同时,在实际应用中,还需要根据具体情况进行进一步的优化和调整,以满足不同的需求。SSL 加密是网络安全的重要保障,合理配置和维护是确保系统安全稳定运行的关键。
580 60
|
8月前
|
缓存 负载均衡 应用服务中间件
Nginx七层(应用层)反向代理:HTTP反向代理proxy_pass篇
通过使用Nginx的反向代理功能,可以有效地提高Web应用的性能、安全性和可扩展性。配置过程中需要注意不同场景下的具体需求,如负载均衡、SSL终止和缓存策略等。正确配置和优化Nginx反向代理可以显著提升系统的整体表现。
1281 20
|
9月前
|
缓存 Java 应用服务中间件
nginx的正向代理和反向代理以及tomcat
Nginx的正向代理和反向代理功能在不同的场景中具有重要作用,正向代理主要用于客户端访问控制和匿名浏览,而反向代理则用于负载均衡和高可用性服务。Tomcat作为Java Web应用服务器,与Nginx结合使用,可以显著提升Web应用的性能和稳定性。通过合理配置Nginx和Tomcat,可以构建高效、稳定和可扩展的Web服务架构。
338 11
|
9月前
|
存储 应用服务中间件 nginx
nginx反向代理bucket目录配置
该配置实现通过Nginx代理访问阿里云OSS存储桶中的图片资源。当用户访问代理域名下的图片URL(如 `http://代理域名/123.png`)时,Nginx会将请求转发到指定的OSS存储桶地址,并重写路径为 `/prod/files/2024/12/12/123.png`。
327 5
|
4月前
|
应用服务中间件 Linux 网络安全
Centos 8.0中Nginx配置文件和https正书添加配置
这是一份Nginx配置文件,包含HTTP与HTTPS服务设置。主要功能如下:1) 将HTTP(80端口)请求重定向至HTTPS(443端口),增强安全性;2) 配置SSL证书,支持TLSv1.1至TLSv1.3协议;3) 使用uWSGI与后端应用通信(如Django);4) 静态文件托管路径设为`/root/code/static/`;5) 定制错误页面(404、50x)。适用于Web应用部署场景。
581 87
|
4月前
|
负载均衡 应用服务中间件 nginx
Nginx配置与命令
Nginx 是一款高性能的 HTTP 和反向代理服务器,其配置文件灵活且功能强大。本文介绍了 Nginx 配置的基础结构和常用指令,包括全局块、Events 块、HTTP 块及 Server 块的配置方法,以及静态资源服务、反向代理、负载均衡、HTTPS 和 URL 重写等功能实现。此外,还提供了常用的 Nginx 命令操作,如启动、停止、重载配置和日志管理等,帮助用户高效管理和优化服务器性能。