nginx缓存cache的5种方案
上一篇 / 下一篇 2010-01-26 08:44:49 / 个人分类:其它
nginx缓存cache的5种方案
1、传统缓存之一(404)
)kzj+M6vv w0 这个办法是把nginx的404错误定向到后端,然后用proxy_store把后端返回的页面保存。
.f"R6Cl?D;^0 配置:
1r5{8dD/m5G!K5D0 location / {
sQXI:h0 root /home/html/;#主目录51Testing软件测试网[}SDi
expires 1d;#网页的过期时间
n:~ C5F+^H7o0 error_page 404 =200 /fetch$request_uri;#404定向到/fetch目录下51Testing软件测试网c@\9B.j.i@
}51Testing软件测试网}"\/Y-P6j!@O@ O
location /fetch/ {#404定向到这里51Testing软件测试网ro }F}
internal;#指明这个目录不能在外部直接访问到
-t}]!L2E X0Uy'C||C0 expires 1d;#网页的过期时间
)kzj+M6vv w0 这个办法是把nginx的404错误定向到后端,然后用proxy_store把后端返回的页面保存。
.f"R6Cl?D;^0 配置:
1r5{8dD/m5G!K5D0 location / {
sQXI:h0 root /home/html/;#主目录51Testing软件测试网[}SDi
expires 1d;#网页的过期时间
n:~ C5F+^H7o0 error_page 404 =200 /fetch$request_uri;#404定向到/fetch目录下51Testing软件测试网c@\9B.j.i@
}51Testing软件测试网}"\/Y-P6j!@O@ O
location /fetch/ {#404定向到这里51Testing软件测试网ro }F}
internal;#指明这个目录不能在外部直接访问到
-t}]!L2E X0Uy'C||C0 expires 1d;#网页的过期时间
alias /html/;51Testing软件测试网9e;b8|!HH
proxy_store会将文件保存到这目录下
X3Sea&vh0]d0 proxy_passhttp://www.sudone.com/;#后端upstream地址,/fetch同时是一个代理51Testing软件测试网3LV EPq
proxy_set_header Accept-Encoding '';#让后端不要返回压缩(gzip或deflate)的内容,保存压缩后的内容会引发乱子。
*xYKM;@rU^+u.r0 proxy_store on;#指定nginx将代理返回的文件保存
b6V+U mup$Z:G2i%tE0 proxy_temp_path /home/tmp;#临时目录,这个目录要和/home/html在同一个硬盘分区内51Testing软件测试网.]:u G_Z9g,_
51Testing软件测试网/Y"xd3N(iP%hqR
}
*u[2VrF;xh7d@{l4T0
Hdk;xOvS0 使用的时候还有要注意是nginx要有权限往/home/tmp和/home/html下有写入文件的权限,在linux下nginx一般会配置成nobody用户运行,这样这两个目录就要chown nobody,设成nobody用户专用,当然也可以chmod 777,不过所有有经验的系统管理员都会建议不要随便使用777。
zkH:SUvY{L_0 2、传统缓存之二(!-e)
\Tt\K#H0 原理和404跳转基本一致,但更简洁一些:51Testing软件测试网*xpk)Q}a
location / {
N$C(Q o2S0 root /home/html/;
Di2s_.K p6T1Q0 proxy_store on;
3gLn!k:v8F0 proxy_set_header Accept-Encoding '';
sV9?P4|_b2xd A0 proxy_temp_path /home/tmp;
uZteGw&m0 if ( !-f $request_filename )51Testing软件测试网Ag/nY&f"`
{
SaF$fJ)XmUQP,l0 proxy_passhttp://www.sudone.com/;51Testing软件测试网 yi1F)S/E2NCbB
}51Testing软件测试网ac-O!b3fAa
}
h\.uS)bH h0 可以看到这个配置比404节约了不少代码,它是用!-f来判断请求的文件在文件系统上存不存在,不存在就proxy_pass到后端,返回同样是用proxy_store保存。51Testing软件测试网]-T#_C'n)o2z)O'V[6O
两种传统缓存都有着基本一样的优点和缺点:51Testing软件测试网l:Nk~/m ~a~q
缺点1:不支持带参数的动态链接,比如read.php?id=1,因为nginx只保存文件名,所以这个链接只在文件系统下保存为read.php,这样用户访问read.php?id=2时会返回不正确的结果。同时不支持http://www.sudone.com/这种形式的首页和二级目录http://www.sudone.com/download/,因为nginx非常老实,会将这样的请求照链接写入文件系统,而这个链接显然是一个目录,所以保存失败。这些情况都需要写rewrite才能正确保存。
&[-uom&z.^0 缺点2:nginx内部没有缓存过期和清理的任何机制,这些缓存的文件会永久性地保存在机器上,如果要缓存的东西非常多,那就会撑暴整个硬盘空间。为此可以使用一个shell脚本定期清理,同时可以撰写php等动态程序来做实时更新。51Testing软件测试网,y@e(Z$O+Kv1f
缺点3:只能缓存200状态码,因此后端返回301/302/404等状态码都不会缓存,假如恰好有一个访问量很大的伪静态链接被删除,那就会不停穿透导致后端承载不小压力。51Testing软件测试网A5LMU{^
缺点4:nginx不会自动选择内存或硬盘作为存储介质,一切由配置决定,当然在当前的操作系统里都会有操作系统级的文件缓存机制,所以存在硬盘上也不需要过分担心大并发读取造成的io性能问题。
+r&~%IK2H%[qBu0 nginx传统缓存的缺点也是它和squid等缓存软件的不同之特色,所以也可看作其优点。在生产应用中它常常用作和squid的搭档,squid对于带?的链接往往无法阻挡,而nginx能将其访问拦住,例如:http://sudone.com/?和http://sudone.com/在squid上会被当做两个链接,所以会造成两次穿透;而nginx只会保存一次,无论链接变成http://sudone.com/?1还是http://sudone.com/?123,均不能透过nginx缓存,从而有效地保护了后端主机。
u&e
proxy_store会将文件保存到这目录下
X3Sea&vh0]d0 proxy_passhttp://www.sudone.com/;#后端upstream地址,/fetch同时是一个代理51Testing软件测试网3LV EPq
proxy_set_header Accept-Encoding '';#让后端不要返回压缩(gzip或deflate)的内容,保存压缩后的内容会引发乱子。
*xYKM;@rU^+u.r0 proxy_store on;#指定nginx将代理返回的文件保存
b6V+U mup$Z:G2i%tE0 proxy_temp_path /home/tmp;#临时目录,这个目录要和/home/html在同一个硬盘分区内51Testing软件测试网.]:u G_Z9g,_
51Testing软件测试网/Y"xd3N(iP%hqR
}
*u[2VrF;xh7d@{l4T0
Hdk;xOvS0 使用的时候还有要注意是nginx要有权限往/home/tmp和/home/html下有写入文件的权限,在linux下nginx一般会配置成nobody用户运行,这样这两个目录就要chown nobody,设成nobody用户专用,当然也可以chmod 777,不过所有有经验的系统管理员都会建议不要随便使用777。
zkH:SUvY{L_0 2、传统缓存之二(!-e)
\Tt\K#H0 原理和404跳转基本一致,但更简洁一些:51Testing软件测试网*xpk)Q}a
location / {
N$C(Q o2S0 root /home/html/;
Di2s_.K p6T1Q0 proxy_store on;
3gLn!k:v8F0 proxy_set_header Accept-Encoding '';
sV9?P4|_b2xd A0 proxy_temp_path /home/tmp;
uZteGw&m0 if ( !-f $request_filename )51Testing软件测试网Ag/nY&f"`
{
SaF$fJ)XmUQP,l0 proxy_passhttp://www.sudone.com/;51Testing软件测试网 yi1F)S/E2NCbB
}51Testing软件测试网ac-O!b3fAa
}
h\.uS)bH h0 可以看到这个配置比404节约了不少代码,它是用!-f来判断请求的文件在文件系统上存不存在,不存在就proxy_pass到后端,返回同样是用proxy_store保存。51Testing软件测试网]-T#_C'n)o2z)O'V[6O
两种传统缓存都有着基本一样的优点和缺点:51Testing软件测试网l:Nk~/m ~a~q
缺点1:不支持带参数的动态链接,比如read.php?id=1,因为nginx只保存文件名,所以这个链接只在文件系统下保存为read.php,这样用户访问read.php?id=2时会返回不正确的结果。同时不支持http://www.sudone.com/这种形式的首页和二级目录http://www.sudone.com/download/,因为nginx非常老实,会将这样的请求照链接写入文件系统,而这个链接显然是一个目录,所以保存失败。这些情况都需要写rewrite才能正确保存。
&[-uom&z.^0 缺点2:nginx内部没有缓存过期和清理的任何机制,这些缓存的文件会永久性地保存在机器上,如果要缓存的东西非常多,那就会撑暴整个硬盘空间。为此可以使用一个shell脚本定期清理,同时可以撰写php等动态程序来做实时更新。51Testing软件测试网,y@e(Z$O+Kv1f
缺点3:只能缓存200状态码,因此后端返回301/302/404等状态码都不会缓存,假如恰好有一个访问量很大的伪静态链接被删除,那就会不停穿透导致后端承载不小压力。51Testing软件测试网A5LMU{^
缺点4:nginx不会自动选择内存或硬盘作为存储介质,一切由配置决定,当然在当前的操作系统里都会有操作系统级的文件缓存机制,所以存在硬盘上也不需要过分担心大并发读取造成的io性能问题。
+r&~%IK2H%[qBu0 nginx传统缓存的缺点也是它和squid等缓存软件的不同之特色,所以也可看作其优点。在生产应用中它常常用作和squid的搭档,squid对于带?的链接往往无法阻挡,而nginx能将其访问拦住,例如:http://sudone.com/?和http://sudone.com/在squid上会被当做两个链接,所以会造成两次穿透;而nginx只会保存一次,无论链接变成http://sudone.com/?1还是http://sudone.com/?123,均不能透过nginx缓存,从而有效地保护了后端主机。
u&e