部署环境
OpenResty1.12.5 Codis3.2集群(客户端不支持Redis集群协议故选择了Codis集群) Nginx1.12.1反向代理 Iis7源站
依赖的第三方模块
1 2 3 4 5 6 7 8 9
| echo-nginx-module [https://github.com/openresty/echo-nginx-module](https://github.com/openresty/echo-nginx-module) set-misc-nginx-module [https://github.com/openresty/set-misc-nginx-module](https://github.com/openresty/set-misc-nginx-module) redis-nginx-module redis2-nginx-module [https://github.com/openresty/redis2-nginx-module](https://github.com/openresty/redis2-nginx-module) srcach-nginx-module [https://github.com/openresty/srcache-nginx-module](https://github.com/openresty/srcache-nginx-module)
|
测试架构
客户端——OR入口——Codis缓存——Nginx反向代理——IIS源站
一、测试效果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 测试SET GET KEY http://www.test.com/350/thread-13741876.html OR访问日志 172.17.0.20 - - [13/Sep/2017:20:14:23 +0800] "GET /350/thread-13741876.html HTTP/1.1" "200" 17909 0.060 18361 1382 [0.057] [MISS] [STORE] [6666] 172.17.0.20 - - [13/Sep/2017:20:15:52 +0800] "GET /350/thread-13741876.html HTTP/1.1" "200" 17896 0.003 18327 1382 [-] [HIT] [BYPASS] [-] Nginx访问日志(只有1次记录,第二次缓存命中没有回源) { "@timestamp": "2017-09-13T20:14:33+08:00", "clientRealIp": "172.17.0.20", "size": 17896, "method": "GET", "responsetime": 0.055, "upstreamhost": "172.17.3.97:80", "http_host": "www.test.com", "url": "http://www.test.com/350/thread-13741876.html", "referrer": "-", "agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36", "status": "200"} 6666秒默认缓存 [root@client ]# redis-cli -h 172.17.6.131 -p 19000 172.17.6.131:19000> TTL www.test.com/350/thread-13741876.html (integer) 6639 测试DEL KEY 浏览器发送删除KEY请求 http://www.test.com/delkey/www.test.com/350/thread-13741876.html Codis集群上验证 172.17.6.131:19000> TTL www.test.com/350/thread-13741876.html (integer) -2
|
二、配置详解
1、设置Codis集群信息
1 2 3 4
| upstream redis_server { server 172.17.6.131:19000; #Codis集群对外VIP,TCP协议 keepalive 100; #一个连接池最多100个连接可根据实际情况设置 }
|
2、设置Nginx反向代理
1 2 3
| upstream baa_test_com { server 172.17.2.216:80; #Nginx反向代理前端IP }
|
3、删除key,默认优先级最高,注意每个location里记录日志方便查看
1 2 3 4 5 6
| location ~ /delkey/(.*) { set $redis_key $1; #set redis_key为匹配url()里内容 redis2_query del $redis_key; #redis2_query语法类似redis_cli语法例如语法: redis2_query 指令 参数1 参数2,这里代表删除key,key名字为上面获取的 redis2_pass redis_server; #redis反向代理可知道upsteam明或者IP:端口 access_log /data/wwwlogs/access_www.test.com-delkey.log srcache_log; }
|
4、这里针对目录进行配置测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| location / { default_type text/html; srcache_methods GET; #设置对那些HTTP请求缓存,这里只缓存GET srcache_response_cache_control off; #默认开启,用于http,server,location区域,开启后发现response header的Cache-Control与Expires有以下情况的:private、no-store、no-cache、max-age=0、data-no-more-recently-than-now的跳过缓存;当源站策略为不缓存时需要强制缓存源站内容,这个参数需要设置为off,设置为off后缓存策略参考srcache_expire srcache_store_statuses 200 301 302; #缓存状态吗,根据情况自己设定 srcache_store_max_size 1024000; #设置缓存key最大value值,单位字节 set $key $host$uri; #设置key命名规则:域名加url set_escape_uri $escaped_key $key; #转义key,url里面特殊字符需要转义
srcache_fetch GET /redis_get $key; #获取key内容 srcache_default_expire 6666; #设置默认缓存时间,单位秒 srcache_max_expire 2h; #设置最大缓存时间该值不能大于597h srcache_store PUT /redis_set key=$escaped_key&exptime=$srcache_expire; #存储key时设置key及过期时间,srcache_expire算法是这样的:首先读response header 的Cache-Control:max-age=N,其次读response header的 Expires ,最后读srcahe_default_expire
add_header X-Cached-From $srcache_fetch_status; #添加命中状态响应头 add_header X-Cached-Store $srcache_store_status; #添加存储状态响应头 add_header X-Key $key; #添加key名字响应头 add_header X-expire $srcache_expire; #添加过期时间响应头
access_log /data/wwwlogs/access_baa.test.com-redis.log srcache_log; proxy_pass http://baa_test_com;
}
|
5、GET KEY配置
1 2 3 4 5
| location = /redis_get { internal; #内部访问为了安全 set $redis_key $args; #对应前面的srcache_fetch GET /redis_get $key ,这个$args就是key的名字 redis_pass redis_server; }
|
6、SET KEY配置
1 2 3 4 5 6 7 8
| location = /redis_set { internal; set_unescape_uri $exptime $arg_exptime; #对应前面的srcache_store PUT /redis_set key=$escaped_key&exptime=$srcache_expire; 这里是获取并设置过期时间且使用了非转义 set_unescape_uri $key $arg_key; #对应前面的srcache_store PUT /redis_set key=$escaped_key&exptime=$srcache_expire; 这里是获取并设置key且使用了非转义 redis2_query set $key $echo_request_body; #这里正式存储key,key的value值是请求体,这里用到了echo模块 redis2_query expire $key $exptime; #设置key的过期时间 redis2_pass redis_server; }
|
7、日志格式,分正常格式与Srcache格式
1 2 3 4
| log_format srcache_log '$remote_addr - $remote_user [$time_local] "$request" ' '"$status" $body_bytes_sent $request_time $bytes_sent $request_length ' '[$upstream_response_time] [$srcache_fetch_status] [$srcache_store_status] [$srcache_expire]'; 日志格式对比传统的nginx日志格式新增了缓存名字状态、缓存存储状态、过期时间
|
8、完整配置文件如下
略,根据实际情况修改。