![](/icons/47671de.gif)
![](/icons/47671dou.gif)
![](/icons/47671dou.gif)
![](/icons/47671dou2.gif)
1、传统缓存Cache的
![](/icons/47671yi.gif)
这个办法是把nginx
![](/icons/47671de.gif)
![](/icons/47671cuowu.gif)
![](/icons/47671dou.gif)
![](/icons/47671de.gif)
![](/icons/47671dou2.gif)
配置:
location / {
root /home/html/;#主目录
expires 1d;#网页
过期时间
error_page 404 =200 /fetch$request_uri;#404定向到/fetch目录下
}
location /fetch/ {#404定向到这里
ernal;#指明这个目录不能在外部直接访问到
expires 1d;#网页
过期时间
alias /home/html/;#虚拟目录文件系统地址要和locaion /
致
proxy_store会将文件保存到这目录下
proxy_pass http://www.sudone.com/;#后端upstream地址
/fetch同时是
个代理
proxy_
_header Accept-Encoding '';#让后端不要返回压缩(gzip或deflate)
内容
保存压缩后
内容会引发乱子
proxy_store _disibledevent=> 缺点2:nginx内部没有缓存Cache过期和清理
任何机制
这些缓存Cache
文件会永久性地保存在机器上
如果要缓存Cache
东西非常多
那就会撑暴整个硬盘空间
为此可以使用
个shell脚本定期清理
同时可以撰写php等动态
来做实时更新
缺点3:只能缓存Cache200状态码
因此后端返回301/302/404等状态码都不会缓存Cache
假如恰好有
个访问量很大
伪静态链接被删除
那就会不停穿透导致后端承载不小压力
缺点4:nginx不会自动选择内存或硬盘作为存储介质![](/icons/47671dou.gif)
切由配置决定
当然在当前
操作系统里都会有操作系统级
文件缓存Cache机制
所以存在硬盘上也不需要过分担心大并发读取造成
io性能问题
nginx传统缓存Cache
缺点也是它和squid等缓存Cache软件Software
区别的特色
所以也可看作其优点
在生产应用中它常常用作和squid
搭档
squid对于带?
链接往往无法阻挡
而nginx能将其访问拦住
例如:http://sudone.com/?和http://sudone.com/在squid上会被当做两个链接
所以会造成两次穿透;而nginx只会保存
次
无论链接变成http://sudone.com/?1还是http://sudone.com/?123
均不能透过nginx缓存Cache
从而有效地保护了后端主机
nginx会非常老实地将链接形式保存到文件系统中
这样对于
个链接
可以很方便地查阅它在缓存Cache机器上
缓存Cache状态和内容
也可以很方便地和别
文件管理器如rsync等配合使用
它完完全全就是
个文件系统结构
这两种传统缓存Cache都可以在linux下将文件保存到/dev/shm里![](/icons/47671dou.gif)
般我也是这么做![](/icons/47671de.gif)
这样可以利用系统内存来做缓存Cache
利用内存
话
清理过期内容速度就会快得多
使用/dev/shm/时除了要把tmp目录也指向到/dev/shm这个分区外
如果有大量小文件和目录
还要修改
下这个内存分区
inode数量和最大容量:
mount -o size=2500M -o nr_inodes=480000 -o noatime,nodiratime -o remount /dev/shm
上面
命令在
台有3G内存
机器上使用![](/icons/47671dou.gif)
/dev/shm默认最大内存是系统内存![](/icons/47671de.gif)
半就是1500M
这条命令将其调大成2500M
同时shm系统inode数量默认情况下可能是不够用![](/icons/47671de.gif)
但有趣
是它可以随意调节
这里调节为480000保守了点
但也基本够用了
3、基于memcached
缓存Cache
nginx对memcached有所支持
但是功能并不是特别的强
性能上还是非常的优秀
location /mem/ {
( $uri ~ "^/mem/([0-9A-Za-z_]*)$" )
{
$memcached_key "$1";
memcached_pass 192.168.1.2:11211;
}
expires 70;
}
这个配置会将http://sudone.com/mem/abc指明到memcached
abc这个key去取数据
nginx目前没有写入memcached
任何机制
所以要往memcached里写入数据得用后台
动态语言完成
可以利用404定向到后端去写入数据
4、基于第 3方插件ncache
ncache是新浪兄弟开发![](/icons/47671de.gif)
个不错
项目
它利用nginx和memcached实现了
部分类似squid缓存Cache
功能
我并没有使用这个插件
经验
可以参考:
http://code.google.com/p/ncache/
5、nginx新开发
proxy_cache功能
从nginx-0.7.44版开始
nginx支持了类似squid较为正规
cache功能
目前还处于开发阶段
支持相当有限
这个缓存Cache是把链接用md5编码hash后保存
所以它可以支持任意链接
同时也支持404/301/302这样
非200状态
配置:
首先配置
个cache空间:
proxy_cache_path /path/to/cache levels=1:2 keys_zone=NAME:10m inactive=5m max_size=2m clean_time=1m;
注意这个配置是在server标签外
levels指定该缓存Cache空间有两层hash目录
第
层目录是1个字母
第 2层为2个字母
保存
文件名就会类似/path/to/cache/c/29/b7f54b2df7773722d382f4809d65029c;keys_zone为这个空间起个名字
10m指空间大小为10MB;inactive
5m指缓存Cache默认时长5分钟;max_size
2m是指单个文件超过2m
就不缓存Cache;clean_time指定
分钟清理
次缓存Cache
location / {
proxy_pass http://www.sudone.com/;
proxy_cache NAME;#使用NAME这个keys_zone
proxy_cache_valid 200 302 1h;#200和302状态码保存1小时
proxy_cache_valid 301 1d;#301状态码保存
天
proxy_cache_valid any 1m;#其它
保存
分钟
}
ps:支持cache
0.7.44到0.7.51这几个版本
稳定性均有问题
访问有些链接会出现![](/icons/47671cuowu.gif)
所以这几个版本最好不要在生产环境中使用
nginx-0.7下目前所知较为稳定
版本是0.7.39
稳定版0.6.36版也是近期更新
如果在配置里没有使用到0.7![](/icons/47671de.gif)
些新标签新功能
也可以使用0.6.36版
延伸阅读
最新评论