基于Redis+Srcache_nginx服务器缓存


nginx-reverse-proxy-conf


关于篇文章,是对之前 《分布式服务器集群架构方案思考》 的关于cache实践

主要实现了基于redis和srcache_nginx服务器缓存(基于LNMP环境)


0x01.Web缓存的类型

在Web应用领域,Web缓存大致可以分为以下几种类型:

数据库数据缓存:

在大型网站下,会频繁地处理数据库信息,导致数据库压力增加,为了提供查询的性能,会将查询后的数据放到内存中进行缓存,下次查询时,直接从内存缓存直接返回,提供响应效率。比如常用的缓存方案有memcached等。


服务器端缓存:

A.代理服务器缓存:

关于服务器缓存,有很多种方式,常用的代理缓存有varnish和squid。

后来用的多的是varnish,Varnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸Verdens Gang使用3台Varnish代替了原来的12台Squid,性能比以前更好。

关于varnish,可以看我之前搭建过的教程 《varnish缓存》

为了提前预备足够的承受能力,我这里下选择redis处理服务器缓存。

redis有很多优点适合当前环境:

  • 支持分布式redis拓展,当网站压力过大,一台redis支撑不住时候,可以增加分布式redis。

  • 键值存储数据,轻巧高效。redis被成为服务器开发的瑞士军刀,就是因为轻,快著名。

B.CDN缓存:

CDN(Content delivery networks)缓存,也叫网关缓存、反向代理缓存。CDN缓存一般是由网站管理员自己部署,为了让他们的网站更容易扩展并获得更好的性能。


Web应用层缓存

主要在应用层逻辑添加缓存,关于这个已经集成在Jue的后台框架了,并且已经做过测试,《代码性能-php》

主要通过代码逻辑和缓存策略,实现对数据,页面,图片等资源的缓存,可以根据实际情况选择将数据存在文件系统或者内存中,减少数据库查询或者读写瓶颈,提高响应效率。


浏览器端缓存

浏览器缓存根据一套与服务器约定的规则进行工作,在同一个会话过程中会检查一次并确定缓存的副本足够新。这个部分主要由浏览器处理。

Nginx本身就自带缓存处理,我们可以直接在server里面对静态文件做过期处理,实现静态文件的缓存。




0x02.安装与配置

A.Nginx编译安装

我用的是lnmp环境做开发,所以,在运行完lnmp安装后,要重新编译安装nginx,添加我们想要的模块。

先进去/lnmp-full/nginx/ 目录,编辑下nginx的配置,重新编译安装下nginx:

cd lnmp1.1-full/nginx-1.6.0/

vim install.sh

天加下面的东西

./configure --user=www --group=www --prefix=/usr/local/nginx 
--add-module=/path/to/ngx_devel_kit-master 
--add-module=/path/to/set-misc-nginx-module
--add-module=/path/to/srcache-nginx-module 
--add-module=/path/to/lua-nginx-module 
--add-module=/path/to/lua-resty-redis 
--add-module=/path/to/redis2-nginx-module
--add-module=/path/to/echo-nginx-module  
--with-ipv6

make && make install


这里我只显示几个必须安装的模块,具体包要自行下载,指明路径。

set-misc-nginx 是一个处理各个加密算法的包,在这里主要处理key的hash加密。

srcache-nginx


B.关于Lua

这里需要安装队lua的依赖,关于lua的安装,这里不说了。


C.关于Redis

安装redis,只要在官网下载个包,直接跑就可以了。

下面是redis配置文件。

vim /path/to/redis.conf

daemonize yes
pidfile /var/run/redis-6379.pid
port 6379
bind 127.0.0.1
timeout 0
tcp-keepalive 0
loglevel notice
logfile stdout
databases 16
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
slave-serve-stale-data yes
slave-read-only yes
repl-disable-tcp-nodelay no
slave-priority 100
maxmemory 8096mb    
maxmemory-policy volatile-ttl
appendonly no
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes


D.关于nginx配置

在http里面添加

http{    
    upstream redis {
            server 127.0.0.1:6379;
                keepalive 512;
    }
}

在server里面添加:

server{
    location = /redis_get {
            internal;
            set_md5 $redis_key $args;
            redis_pass redis;
    }

    location = /redis_set {
            internal;

            set_unescape_uri $exptime $arg_exptime;    //过期时间更新
            set_unescape_uri $key $arg_key;            //提取缓存
            set_md5 $key;

            redis2_query set $key $echo_request_body;  //添加缓存
            redis2_query expire $key $exptime;         //过期处理
            redis2_pass redis;
    }

    //这里是要做缓存的位置
    location ~ [^/]\.php(/|$) {
            set $key $request_uri;
            set_escape_uri $escaped_key $key;
            srcache_fetch GET /redis_get $key;          //获取缓存信息
            srcache_default_expire 1;                   //过期处理
            srcache_store PUT /redis_set key=$escaped_key&exptime=$srcache_expire;
            try_files $uri =404;
            fastcgi_pass  unix:/tmp/php-cgi.sock;
            fastcgi_index index.php;
            include fastcgi.conf;
            access_log /home/wwwlogs/redis-cache.log access;
        }

}

一样的,这里只是把主要的东西写进来了,其他东西记得添加进去。




0x03.测试结果

没有做缓存状态:

没有做缓存状态:

做缓存状态:

做缓存状态:




本文出自 夏日小草,转载请注明出处:http://homeway.me/2014/12/25/nginx-redis-srcache-cache/


-by小草

2014-12-25 00:55:51

Fork me on GitHub