nginx缓存cache的5种方案
上一篇 / 下一篇 2010-01-26 08:44:49 / 个人分类:其它
nginx缓存cache的5种方案
1、传统缓存之一(404)51Testing软件测试网*y&W@[auCc hh
这个办法是把nginx的404错误定向到后端,然后用proxy_store把后端返回的页面保存。51Testing软件测试网 CfIVm9V'_`D
配置:51Testing软件测试网:A7Ua;s4k$H z)Q
location / {
(rX+Ag{2[0 root /home/html/;#主目录
j]n;wR1{q C[2|"B0 expires 1d;#网页的过期时间
:Vb v;u7C+Q \I i0 error_page 404 =200 /fetch$request_uri;#404定向到/fetch目录下51Testing软件测试网T&z%Nq{eGq9qz~
}
r Y W4^7J'J sL\~0 location /fetch/ {#404定向到这里51Testing软件测试网0Vqb1sj g8w
internal;#指明这个目录不能在外部直接访问到51Testing软件测试网.U|M`Uw
expires 1d;#网页的过期时间
这个办法是把nginx的404错误定向到后端,然后用proxy_store把后端返回的页面保存。51Testing软件测试网 CfIVm9V'_`D
配置:51Testing软件测试网:A7Ua;s4k$H z)Q
location / {
(rX+Ag{2[0 root /home/html/;#主目录
j]n;wR1{q C[2|"B0 expires 1d;#网页的过期时间
:Vb v;u7C+Q \I i0 error_page 404 =200 /fetch$request_uri;#404定向到/fetch目录下51Testing软件测试网T&z%Nq{eGq9qz~
}
r Y W4^7J'J sL\~0 location /fetch/ {#404定向到这里51Testing软件测试网0Vqb1sj g8w
internal;#指明这个目录不能在外部直接访问到51Testing软件测试网.U|M`Uw
expires 1d;#网页的过期时间
alias /html/;
:R2zCW7b~$n"xw0 proxy_store会将文件保存到这目录下51Testing软件测试网X#| _gd.^r,R4N
proxy_passhttp://www.sudone.com/;#后端upstream地址,/fetch同时是一个代理51Testing软件测试网2IM S8r({nt0xiu
proxy_set_header Accept-Encoding '';#让后端不要返回压缩(gzip或deflate)的内容,保存压缩后的内容会引发乱子。
7h#?(V E6qg,T:G4F0 proxy_store on;#指定nginx将代理返回的文件保存
{'p_jQ6y2f0 proxy_temp_path /home/tmp;#临时目录,这个目录要和/home/html在同一个硬盘分区内51Testing软件测试网FL9Ch:H"huK
51Testing软件测试网 Fh@!l_!`
}
!s%HB~"A2d_``0
+I5QQCz!xk I0 使用的时候还有要注意是nginx要有权限往/home/tmp和/home/html下有写入文件的权限,在linux下nginx一般会配置成nobody用户运行,这样这两个目录就要chown nobody,设成nobody用户专用,当然也可以chmod 777,不过所有有经验的系统管理员都会建议不要随便使用777。51Testing软件测试网9Rqj|L;Ry
2、传统缓存之二(!-e)51Testing软件测试网?z$zG!c,vE,F HP
原理和404跳转基本一致,但更简洁一些:51Testing软件测试网{R{7oo\(e
location / {
~ kO? g0 root /home/html/;51Testing软件测试网\^.ZHc
proxy_store on;51Testing软件测试网H2Z @6rKC |4M
proxy_set_header Accept-Encoding '';51Testing软件测试网*s#|^SYHu$pt*H#L
proxy_temp_path /home/tmp;
U5f Z$tLP0@0 if ( !-f $request_filename )
x7t/]3AT4MN1jkG0 {
Tg^a3U }/E0q0 proxy_passhttp://www.sudone.com/;
o9{P!Y5Xo+\%K0 }51Testing软件测试网6fJU4vS&Ul
}51Testing软件测试网HY BWw]+r
可以看到这个配置比404节约了不少代码,它是用!-f来判断请求的文件在文件系统上存不存在,不存在就proxy_pass到后端,返回同样是用proxy_store保存。51Testing软件测试网'u.{]7a3j|P p?
两种传统缓存都有着基本一样的优点和缺点:51Testing软件测试网/`$N T7a4}
缺点1:不支持带参数的动态链接,比如read.php?id=1,因为nginx只保存文件名,所以这个链接只在文件系统下保存为read.php,这样用户访问read.php?id=2时会返回不正确的结果。同时不支持http://www.sudone.com/这种形式的首页和二级目录http://www.sudone.com/download/,因为nginx非常老实,会将这样的请求照链接写入文件系统,而这个链接显然是一个目录,所以保存失败。这些情况都需要写rewrite才能正确保存。
*S@;I8no'?3Y0 缺点2:nginx内部没有缓存过期和清理的任何机制,这些缓存的文件会永久性地保存在机器上,如果要缓存的东西非常多,那就会撑暴整个硬盘空间。为此可以使用一个shell脚本定期清理,同时可以撰写php等动态程序来做实时更新。
m`8GDRSd0 缺点3:只能缓存200状态码,因此后端返回301/302/404等状态码都不会缓存,假如恰好有一个访问量很大的伪静态链接被删除,那就会不停穿透导致后端承载不小压力。51Testing软件测试网y;iD`6n)ImZ4m/EV1`
缺点4:nginx不会自动选择内存或硬盘作为存储介质,一切由配置决定,当然在当前的操作系统里都会有操作系统级的文件缓存机制,所以存在硬盘上也不需要过分担心大并发读取造成的io性能问题。
1EE#hiU&mB0 nginx传统缓存的缺点也是它和squid等缓存软件的不同之特色,所以也可看作其优点。在生产应用中它常常用作和squid的搭档,squid对于带?的链接往往无法阻挡,而nginx能将其访问拦住,例如:http://sudone.com/?和http://sudone.com/在squid上会被当做两个链接,所以会造成两次穿透;而nginx只会保存一次,无论链接变成http://sudone.com/?1还是http://sudone.com/?123,均不能透过nginx缓存,从而有效地保护了后端主机。
s,P9A,p?6E0 nginx会非常老实地将链接形式保存到文件系统中,这样对于一个链接,可以很方便地查阅它在缓存机器上的缓存状态和内容,也可以很方便地和别的文件管理器如rsync等配合使用,它完完全全就是一个文件系统结构。51Testing软件测试网Nu$\&xi6}x.T
这两种传统缓存都可以在linux下将文件保存到/dev/shm里,一般我也是这么做的,这样可以利用系统内存来做缓存,利用内存的话,清理过期内容速度就会快得多。使用/dev/shm/时除了要把tmp目录也指向到/dev/shm这个分区外,如果有大量小文件和目录,还要修改一下这个内存分区的inode数量和最大容量:51Testing软件测试网xq#xl5V0Ub;Ip
mount -o size=2500M -o nr_inodes=480000 -o noatime,nodiratime -o remount /dev/shm
'a#Bg+z)N9\gk1b`0 上面的命令在一台有3G内存的机器上使用,因为/dev/shm默认最大内存是系统内存的一半就是1500M,这条命令将其调大成2500M,同时shm系统inode数量默认情况下可能是不够用的,但有趣的是它可以随意调节,这里调节为480000保守了点,但也基本够用了。51Testing软件测试网dl]uTa~
3、基于memcached的缓存
B6hx"j)@I8Q"{0 nginx对memcached有所支持,但是功能并不是特别之强,性能上还是非常之优秀。51Testing软件测试网k)\:Fm-eq
location /mem/ {
;e,D^)H(CD,O#k0 if ( $uri ~ "^/mem/([0-9A-Za-z_]*)$" )
9arPiyL9~tN0 {
8Pw d|\}]JQ0 set $memcached_key "$1";
'mJyV3[9k5t0 memcached_pass 192.168.1.2:11211;51Testing软件测试网 w$`n.ei ux)wP5w
}
K0v&X B _z:?)O0 expires 70;
lv z6`&l
:R2zCW7b~$n"xw0 proxy_store会将文件保存到这目录下51Testing软件测试网X#| _gd.^r,R4N
proxy_passhttp://www.sudone.com/;#后端upstream地址,/fetch同时是一个代理51Testing软件测试网2IM S8r({nt0xiu
proxy_set_header Accept-Encoding '';#让后端不要返回压缩(gzip或deflate)的内容,保存压缩后的内容会引发乱子。
7h#?(V E6qg,T:G4F0 proxy_store on;#指定nginx将代理返回的文件保存
{'p_jQ6y2f0 proxy_temp_path /home/tmp;#临时目录,这个目录要和/home/html在同一个硬盘分区内51Testing软件测试网FL9Ch:H"huK
51Testing软件测试网 Fh@!l_!`
}
!s%HB~"A2d_``0
+I5QQCz!xk I0 使用的时候还有要注意是nginx要有权限往/home/tmp和/home/html下有写入文件的权限,在linux下nginx一般会配置成nobody用户运行,这样这两个目录就要chown nobody,设成nobody用户专用,当然也可以chmod 777,不过所有有经验的系统管理员都会建议不要随便使用777。51Testing软件测试网9Rqj|L;Ry
2、传统缓存之二(!-e)51Testing软件测试网?z$zG!c,vE,F HP
原理和404跳转基本一致,但更简洁一些:51Testing软件测试网{R{7oo\(e
location / {
~ kO? g0 root /home/html/;51Testing软件测试网\^.ZHc
proxy_store on;51Testing软件测试网H2Z @6rKC |4M
proxy_set_header Accept-Encoding '';51Testing软件测试网*s#|^SYHu$pt*H#L
proxy_temp_path /home/tmp;
U5f Z$tLP0@0 if ( !-f $request_filename )
x7t/]3AT4MN1jkG0 {
Tg^a3U }/E0q0 proxy_passhttp://www.sudone.com/;
o9{P!Y5Xo+\%K0 }51Testing软件测试网6fJU4vS&Ul
}51Testing软件测试网HY BWw]+r
可以看到这个配置比404节约了不少代码,它是用!-f来判断请求的文件在文件系统上存不存在,不存在就proxy_pass到后端,返回同样是用proxy_store保存。51Testing软件测试网'u.{]7a3j|P p?
两种传统缓存都有着基本一样的优点和缺点:51Testing软件测试网/`$N T7a4}
缺点1:不支持带参数的动态链接,比如read.php?id=1,因为nginx只保存文件名,所以这个链接只在文件系统下保存为read.php,这样用户访问read.php?id=2时会返回不正确的结果。同时不支持http://www.sudone.com/这种形式的首页和二级目录http://www.sudone.com/download/,因为nginx非常老实,会将这样的请求照链接写入文件系统,而这个链接显然是一个目录,所以保存失败。这些情况都需要写rewrite才能正确保存。
*S@;I8no'?3Y0 缺点2:nginx内部没有缓存过期和清理的任何机制,这些缓存的文件会永久性地保存在机器上,如果要缓存的东西非常多,那就会撑暴整个硬盘空间。为此可以使用一个shell脚本定期清理,同时可以撰写php等动态程序来做实时更新。
m`8GDRSd0 缺点3:只能缓存200状态码,因此后端返回301/302/404等状态码都不会缓存,假如恰好有一个访问量很大的伪静态链接被删除,那就会不停穿透导致后端承载不小压力。51Testing软件测试网y;iD`6n)ImZ4m/EV1`
缺点4:nginx不会自动选择内存或硬盘作为存储介质,一切由配置决定,当然在当前的操作系统里都会有操作系统级的文件缓存机制,所以存在硬盘上也不需要过分担心大并发读取造成的io性能问题。
1EE#hiU&mB0 nginx传统缓存的缺点也是它和squid等缓存软件的不同之特色,所以也可看作其优点。在生产应用中它常常用作和squid的搭档,squid对于带?的链接往往无法阻挡,而nginx能将其访问拦住,例如:http://sudone.com/?和http://sudone.com/在squid上会被当做两个链接,所以会造成两次穿透;而nginx只会保存一次,无论链接变成http://sudone.com/?1还是http://sudone.com/?123,均不能透过nginx缓存,从而有效地保护了后端主机。
s,P9A,p?6E0 nginx会非常老实地将链接形式保存到文件系统中,这样对于一个链接,可以很方便地查阅它在缓存机器上的缓存状态和内容,也可以很方便地和别的文件管理器如rsync等配合使用,它完完全全就是一个文件系统结构。51Testing软件测试网Nu$\&xi6}x.T
这两种传统缓存都可以在linux下将文件保存到/dev/shm里,一般我也是这么做的,这样可以利用系统内存来做缓存,利用内存的话,清理过期内容速度就会快得多。使用/dev/shm/时除了要把tmp目录也指向到/dev/shm这个分区外,如果有大量小文件和目录,还要修改一下这个内存分区的inode数量和最大容量:51Testing软件测试网xq#xl5V0Ub;Ip
mount -o size=2500M -o nr_inodes=480000 -o noatime,nodiratime -o remount /dev/shm
'a#Bg+z)N9\gk1b`0 上面的命令在一台有3G内存的机器上使用,因为/dev/shm默认最大内存是系统内存的一半就是1500M,这条命令将其调大成2500M,同时shm系统inode数量默认情况下可能是不够用的,但有趣的是它可以随意调节,这里调节为480000保守了点,但也基本够用了。51Testing软件测试网dl]uTa~
3、基于memcached的缓存
B6hx"j)@I8Q"{0 nginx对memcached有所支持,但是功能并不是特别之强,性能上还是非常之优秀。51Testing软件测试网k)\:Fm-eq
location /mem/ {
;e,D^)H(CD,O#k0 if ( $uri ~ "^/mem/([0-9A-Za-z_]*)$" )
9arPiyL9~tN0 {
8Pw d|\}]JQ0 set $memcached_key "$1";
'mJyV3[9k5t0 memcached_pass 192.168.1.2:11211;51Testing软件测试网 w$`n.ei ux)wP5w
}
K0v&X B _z:?)O0 expires 70;
lv z6`&l