OpenResty Codis集群缓存系统

OpenResty Codis集群缓存系统

部署环境

OpenResty1.12.5

Codis3.2集群(客户端不支持Redis集群协议故选择了Codis集群)

Nginx1.12.1反向代理

Iis7源站

依赖的第三方模块

echo-nginx-module
https://github.com/openresty/echo-nginx-module 
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 
srcach-nginx-module 
https://github.com/openresty/srcache-nginx-module

测试架构

客户端------OR入口------Codis缓存------Nginx反向代理------IIS源站

一,测试效果

测试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集群信息

    upstream redis_server {
        server 172.17.6.131:19000;#Codis集群对外VIP,TCP协议
        keepalive 100;#一个连接池最多100个连接可根据实际情况设置
}

2,设置Nginx反向代理

    upstream baa_bitauto_com {
        server 172.17.2.216:80;       #Nginx反向代理前端IP
}

3,删除key,默认优先级最高,注意每个location里记录日志方便查看

        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,这里针对目录进行配置测试

        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.bitauto.com-redis.log srcache_log;
            proxy_pass http://baa_bitauto_com;
        }

5,GET KEY配置

        location = /redis_get {
                internal;#内部访问为了安全
                set $redis_key $args;      #对应前面的srcache_fetch GET /redis_get $key ,这个$args就是key的名字
                redis_pass redis_server;
        }

6,SET KEY配置

        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格式

    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,完整配置文件如下

 略,根据实际情况修改。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算教程系列

如何在Ubuntu 16.04上使用Deployer自动部署Laravel应用程序

Laravel是一个开源的PHP Web框架,旨在使常见的Web开发任务(如身份验证,路由和缓存)变得更加容易。Deployer是一个开源的PHP部署工具,为许...

3231
来自专栏Spark学习技巧

大数据基础系列之spark的监控体系介绍

目前有好几种监控spark应用程序的工具:web UIs,指标系统和外部监控仪。 一,web界面 1,界面的基本介绍 每一个Spark应用程序都会启动一个spa...

4495
来自专栏Golang语言社区

HTTP协议漫谈

简介 园子里已经有不少介绍HTTP的的好文章。对HTTP的一些细节介绍的比较好,所以本篇文章不会对HTTP的细节进行深究,而是从够高和更结构化的角度将H...

3796
来自专栏xcywt

《Linux命令行与shell脚本编程大全》第十章 使用编辑器

主要介绍vim, nano, emacs,KWrite,Kate,GNOME 10.1 vim Unix系统最初的编辑器 10.1.1检查vim软件包 先搞明白...

2028
来自专栏java架构师

Hadoop总结篇之四---底层通信是怎么做到的

上一篇介绍了一个job的提交过程。期间多次提到通信协议。那么协议是什么? 协议其实就是通信的双方所遵守的一套规范,这套规范规定了通信时传输的数据的固定的格式。 ...

3666
来自专栏Golang语言社区

HTTP协议漫谈

简介 园子里已经有不少介绍HTTP的的好文章。对HTTP的一些细节介绍的比较好,所以本篇文章不会对HTTP的细节进行深究,而是从够高和更结构化的角度将H...

35213
来自专栏FreeBuf

使用CMSTP绕过AppLocker的方法介绍

CMSTP是一个与Microsoft连接管理器配置文件安装程序关联的二进制文件。它接受INF文件,这些文件可以通过恶意命令武器化,以脚本(SCT)和DLL的形式...

963
来自专栏博客园迁移

jenkins自动部署应用到tomcat中,编译后shell脚本的简单示例

1.先配置好jenkins需要用到的其他外部组件  jdk,maven,git/svn

1903
来自专栏云计算教程系列

如何在服务器上安装LAMP

在本教程中,我们将在Ubuntu上安装LAMP。Ubuntu将满足我们的第一个要求:Linux操作系统。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免...

4482
来自专栏Java帮帮-微信公众号-技术文章全总结

java.io.IOException 断开的管道【面试+工作】

查看采集数据的tomcat日志,习惯性的先翻到日志的最后去查看有没有异常的打印,果然发现了好几种异常信息,但是最多还是这个:

4413

扫码关注云+社区

领取腾讯云代金券