首页 > 网站 > Nginx > 正文

Nginx缓存Cache的配置方案以及相关内存占用问题解决

2024-08-30 12:26:21
字体:
来源:转载
供稿:网友

nginx缓存cache的5种方案
 1、传统缓存之一(404)
  这个办法是把nginx的404错误定向到后端,然后用proxy_store把后端返回的页面保存。
  配置:

  location / {  root /home/html/;#主目录  expires 1d;#网页的过期时间  error_page 404 =200 /fetch$request_uri;#404定向到/fetch目录下  }  location /fetch/ {#404定向到这里  internal;#指明这个目录不能在外部直接访问到  expires 1d;#网页的过期时间 alias /html/; proxy_store会将文件保存到这目录下  proxy_pass//www.Vevb.com/;#后端upstream地址,/fetch同时是一个代理  proxy_set_header Accept-Encoding '';#让后端不要返回压缩(gzip或deflate)的内容,保存压缩后的内容会引发乱子。  proxy_store on;#指定nginx将代理返回的文件保存  proxy_temp_path /home/tmp;#临时目录,这个目录要和/home/html在同一个硬盘分区内  }

  使用的时候还有要注意是nginx要有权限往/home/tmp和/home/html下有写入文件的权限,在linux下nginx一般会配置成nobody用户运行,这样这两个目录就要chown nobody,设成nobody用户专用,当然也可以chmod 777,不过所有有经验的系统管理员都会建议不要随便使用777。
  2、传统缓存之二(!-e)
  原理和404跳转基本一致,但更简洁一些:

  location / {  root /home/html/;  proxy_store on;  proxy_set_header Accept-Encoding '';  proxy_temp_path /home/tmp;  if ( !-f $request_filename )  {  proxy_pass//www.Vevb.com/;  }  }

  可以看到这个配置比404节约了不少代码,它是用!-f来判断请求的文件在文件系统上存不存在,不存在就proxy_pass到后端,返回同样是用proxy_store保存。
  两种传统缓存都有着基本一样的优点和缺点:
  缺点1:不支持带参数的动态链接,比如read.php?id=1,因为nginx只保存文件名,所以这个链接只在文件系统下保存为read.php,这样用户访问read.php?id=2时会返回不正确的结果。同时不支持//www.Vevb.com/这种形式的首页和二级目录//www.Vevb.com/download/,因为nginx非常老实,会将这样的请求照链接写入文件系统,而这个链接显然是一个目录,所以保存失败。这些情况都需要写rewrite才能正确保存。
  缺点2:nginx内部没有缓存过期和清理的任何机制,这些缓存的文件会永久性地保存在机器上,如果要缓存的东西非常多,那就会撑暴整个硬盘空间。为此可以使用一个shell脚本定期清理,同时可以撰写php等动态程序来做实时更新。
  缺点3:只能缓存200状态码,因此后端返回301/302/404等状态码都不会缓存,假如恰好有一个访问量很大的伪静态链接被删除,那就会不停穿透导致后端承载不小压力。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表