0

0

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

王林

王林

发布时间:2023-05-23 14:01:38

|

3666人浏览过

|

来源于亿速云

转载

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.jb51.net/;#后端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.jb51.net/;
  }
  }

  可以看到这个配置比404节约了不少代码,它是用!-f来判断请求的文件在文件系统上存不存在,不存在就proxy_pass到后端,返回同样是用proxy_store保存。
  两种传统缓存都有着基本一样的优点和缺点:
  缺点1:不支持带参数的动态链接,比如read.php?id=1,因为nginx只保存文件名,所以这个链接只在文件系统下保存为read.php,这样用户访问read.php?id=2时会返回不正确的结果。同时不支持//www.jb51.net/这种形式的首页和二级目录//www.jb51.net/download/,因为nginx非常老实,会将这样的请求照链接写入文件系统,而这个链接显然是一个目录,所以保存失败。这些情况都需要写rewrite才能正确保存。
  缺点2:nginx内部没有缓存过期和清理的任何机制,这些缓存的文件会永久性地保存在机器上,如果要缓存的东西非常多,那就会撑暴整个硬盘空间。为此可以使用一个shell脚本定期清理,同时可以撰写php等动态程序来做实时更新。
  缺点3:只能缓存200状态码,因此后端返回301/302/404等状态码都不会缓存,假如恰好有一个访问量很大的伪静态链接被删除,那就会不停穿透导致后端承载不小压力。
  缺点4:nginx不会自动选择内存或硬盘作为存储介质,一切由配置决定,当然在当前的操作系统里都会有操作系统级的文件缓存机制,所以存在硬盘上也不需要过分担心大并发读取造成的io性能问题。
  nginx传统缓存的缺点也是它和squid等缓存软件的不同之特色,所以也可看作其优点。在生产应用中它常常用作和squid的搭档,squid对于带?的链接往往无法阻挡,而nginx能将其访问拦住,例如:http://jb51.net/?和http://jb51.net/在squid上会被当做两个链接,所以会造成两次穿透;而nginx只会保存一次,无论链接变成http://jb51.net/?1还是http://jb51.net/?123,均不能透过nginx缓存,从而有效地保护了后端主机。
  nginx会非常老实地将链接形式保存到文件系统中,这样对于一个链接,可以很方便地查阅它在缓存机器上的缓存状态和内容,也可以很方便地和别的文件管理器如rsync等配合使用,它完完全全就是一个文件系统结构。
  这两种传统缓存都可以在linux下将文件保存到/dev/shm里,一般我也是这么做的,这样可以利用系统内存来做缓存,利用内存的话,清理过期内容速度就会快得多。使用/dev/shm/时除了要把tmp目录也指向到/dev/shm这个分区外,如果有大量小文件和目录,还要修改一下这个内存分区的inode数量和最大容量:
 

 mount -o size=2500m -o nr_inodes=480000 -o noatime,nodiratime -o remount /dev/shm

  上面的命令在一台有3g内存的机器上使用,因为/dev/shm默认最大内存是系统内存的一半就是1500m,这条命令将其调大成2500m,同时shm系统inode数量默认情况下可能是不够用的,但有趣的是它可以随意调节,这里调节为480000保守了点,但也基本够用了。
  3、基于memcached的缓存
  nginx对memcached有所支持,但是功能并不是特别之强,性能上还是非常之优秀。
 

 location /mem/ {
  if ( $uri ~ "^/mem/([0-9a-za-z_]*)$" )
  {
  set $memcached_key "$1";
  memcached_pass  192.168.1.2:11211;
  }
  expires 70;
  }

  这个配置会将http://jb51.net/mem/abc指明到memcached的abc这个key去取数据。
  nginx目前没有写入memcached的任何机制,所以要往memcached里写入数据得用后台的动态语言完成,可以利用404定向到后端去写入数据。
  4、基于第三方插件ncache
  ncache是新浪兄弟开发的一个不错的项目,它利用nginx和memcached实现了一部分类似squid缓存的功能,我并没有使用这个插件的经验,可以参考:
  http://code.google.com/p/ncache/
  5、nginx新开发的proxy_cache功能
  从nginx-0.7.44版开始,nginx支持了类似squid较为正规的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指定该缓存空间有两层hash目录,第一层目录是1个字母,第二层为2个字母,保存的文件名就会类似/path/to/cache/c/29/b7f54b2df7773722d382f4809d65029c;keys_zone为这个空间起个名字,10m指空间大小为10mb;inactive的5m指缓存默认时长5分钟;max_size的2m是指单个文件超过2m的就不缓存;clean_time指定一分钟清理一次缓存。

X Detector
X Detector

最值得信赖的多语言 AI 内容检测器

下载
  location / {
  proxy_pass//www.jb51.net/;
  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这几个版本的稳定性均有问题,访问有些链接会出现错误,所以这几个版本最好不要在生产环境中使用。nginx-0.7下目前所知较为稳定的版本是0.7.39。稳定版0.6.36版也是近期更新,如果在配置里没有使用到0.7的一些新标签新功能,也可以使用0.6.36版。

nginx缓存的内存占用问题的一般解决方法
1、前些日子某服务被刷,每分钟达到上几百万请求;当时采用了nginx cache来解决的;但是因为某服务不能缓存太久,当时设置了5s,那么带来的问题就是产生大量小文件,而且很快就删除了。
 
2、通过

free -m

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

会发现used是27g;但是通过top查看进程占的内存并没有那么多

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

那内存去哪了?
 
3、通过查阅资料会发现(cat /proc/meminfo)
slab: 22464312 kb
sreclaimable: 16474128 kb (这些是内核保持的但是可以释放的inode和dentry的缓存)
sunreclaim: 5990184 kb
 
4、这些内存为什么会不自动清理呢?
某机房机器系统版本:linux  2.6.32-431.el6.x86_64 #1 smp fri nov 22 03:15:09 utc 2013 x86_64 x86_64 x86_64 gnu/linux(正常,没出现内存快到100%的情况)
某机房机器系统版本:linux  2.6.32-279.el6.x86_64 #1 smp fri jun 22 12:19:21 utc 2012 x86_64 x86_64 x86_64 gnu/linux (不释放)
 
5、通过设置如下参数来设置内存阀值

sysctl -w vm.extra_free_kbytes=6436787
sysctl -w vm.vfs_cache_pressure=10000

相关专题

更多
公务员递补名单公布时间 公务员递补要求
公务员递补名单公布时间 公务员递补要求

公务员递补名单公布时间不固定,通常在面试前,由招录单位(如国家知识产权局、海关等)发布,依据是原入围考生放弃资格,会按笔试成绩从高到低递补,递补考生需按公告要求限时确认并提交材料,及时参加面试/体检等后续环节。要求核心是按招录单位公告及时响应、提交材料(确认书、资格复审材料)并准时参加面试。

0

2026.01.15

公务员调剂条件 2026调剂公告时间
公务员调剂条件 2026调剂公告时间

(一)符合拟调剂职位所要求的资格条件。 (二)公共科目笔试成绩同时达到拟调剂职位和原报考职位的合格分数线,且考试类别相同。 拟调剂职位设置了专业科目笔试条件的,专业科目笔试成绩还须同时达到合格分数线,且考试类别相同。 (三)未进入原报考职位面试人员名单。

4

2026.01.15

国考成绩查询入口 国考分数公布时间2026
国考成绩查询入口 国考分数公布时间2026

笔试成绩查询入口已开通,考生可登录国家公务员局中央机关及其直属机构2026年度考试录用公务员专题网站http://bm.scs.gov.cn/pp/gkweb/core/web/ui/business/examResult/written_result.html,查询笔试成绩和合格分数线,点击“笔试成绩查询”按钮,凭借身份证及准考证进行查询。

2

2026.01.15

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

63

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

32

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

73

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

20

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

25

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

7

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

nginx浅谈
nginx浅谈

共15课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号