转载:http://homeway.me/2014/12/25/nginx-redis-srcache-cache/
关于篇文章,是对之前 《分布式服务器集群架构方案思考》 的关于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加密。
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;
}
}
一样的,这里只是把主要的东西写进来了,其他东西记得添加进去。