设为首页 收藏本站
查看: 996|回复: 0

[经验分享] nginx缓存的原理及配置和nginx的限制访问次数

[复制链接]

尚未签到

发表于 2018-11-13 11:02:04 | 显示全部楼层 |阅读模式
  文章转载地址:https://blog.csdn.net/wangjianno2/article/details/75201020/
  一、nginx缓存的原理及配置
  1、nginx的缓存简介
  nginx的http_proxy模块,可以实现类似于squid的缓存功能。nginx对客户已经访问过的内容在nginx的服务器本地建立副本,这样在一段时间内再次访问该数据时,就不需要通过nginx服务器再次向后端服务器发出请求,所以能减少nginx服务器与后端服务器之间的网络流量,减轻网络拥塞,同时还能减少数据传输延迟,提高用户访问速度。同时,当后端服务器宕机时,nginx服务器上的副本资源还能够回应相关的用户请求,这样能够提高后端服务器的鲁棒性。
  2、nginx cache的配置:
  http{ proxy_cache_path /mnt/node1/cache levels=1:2 keys_zone=my_cache:5m max_size=10m inactive=120m use_temp_path=off;}
  server {
       set $upstream http://ip:port
            location / {
                     proxy_cache my_cache;
                     proxy_pass $upstream;
  }
  }
  2.1配置说明如下:
  proxy_cache_path:本地路径,用来设置nginx缓存资源的存放路径。
  levels:默认所有缓存文件都放在同一个/mnt/node1/cache下,但是会影响缓存的性能,因此通常会在/mnt/node1/cache/ 目录下建立子目录用来分别存放不同的文件。假设levels=1:2,Nginx为将要缓存的资源生成的            key为f4cd0fbc769e94925ec5540b6a4136d0,那么key的最后一位0,以及倒数第2-3位6d作为两级的子目录,也就是该资源最终会被缓存到/mnt/node1/cache/0/6d目录中。
  keys_zone:在共享内存中设置一块存储区域来存放缓存的key和metadata(类似使用次数),这样nginx可以快速判断一个request是否命中或者未命中缓存,1m可以存储8000个key,10m可以存储80000个key。
  max_size:最大的cache空间,如果不指定,会使用掉所有的disk space,当达到配额后,会删除最少使用的cache文件。
  inactive:未被访问文件在缓存中保留的时间。本设置中如果120分钟未被访问则不论状态否是expired,缓存控制程序会删掉文件。inactive默认是10分钟。需要注意的是,inactive和expired配置项的含义是不同的,                     expired只是缓存过期,但不会被删除,inactive是删除指定时间内未被访问的缓存文件
  use_temp_path   #如果为off,则nginx会将缓存文件直接写入指定的cache文件中,而不是使用temp_path存储,official建议为off,避免文件在不同文件系统中不必要的拷贝
  proxy_cache     #启用proxy cache,并指定key_zone。另外,如果proxy_cache off表示关闭掉缓存。
  3、缓存的一些其他知识。
  a、proxy_cache_use_stale 增强站点容错能力
  源站有问题时,nginx可以通过proxy_cache_use_stale指令开启容错能力,即使用缓存内容来响应客户端的请求,如下:
  location / {
  ......
  proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
  }
  如上的配置表示,当作为cache的nginx收到源站返回error、timeout或者其他指定的5XX错误,并且在其缓存中有请求文件的陈旧版本,则会将这些陈旧的文件而不是错误信息发送给客户端。
  b、多磁盘分割缓存
  使用nginx,不需要建立一个RAID(磁盘阵列)。如果有多个硬盘,nginx可以用来在多个硬盘之间分割缓存,如下:
  http { proxy_cache_path /cache/to/hdd1 levels=1:2 keys_zone=my_cache_hdd1:10m max_size=10g inactive=60m use_temp_path=off;
  proxy_cache_path /cache/to/hdd2 levels=1:2 keys_zone=my_cache_hdd2:10m max_size=10g inactive=60m use_temp_path=off;
  split_clients $request_uri $my_cache {
  50%   "my_cache_hdd1";
  50%   "my_cache_hdd2";
  }
  }
  server {
  ...
  location / {
  proxy_cache $my_cache;
  proxy_pass http://my_upstream;
  }
  }
  例子中的两个proxy_cache_path定义了两个缓存分属于两个不同的磁盘。split_clients配置部分指定了请求结果的一半在hdb1,另一半在hdb2中缓存,基于#request_uri(请求UEI)变量的哈希值决定了每一个请求使用哪一个缓存,对于指定URI请求结果通常会被缓存在同一个缓存中。
  c、缓存命中情况的nginx变量$upstream_cache_status
  $upstream_cache_status的可能值有:
  MISS    —— 响应在缓存中找不到,所以需要在服务器中取得。这个响应之后可能会被缓存起来
  BYPASS  —— 响应来自原始服务器而不是缓存,因为请求匹配了一个proxy_cache_bypass,这个响应之后可能会被缓存起来
  EXPIRED —— 缓存中的某一项过期了,来自原始服务器的响应包含最新的内容
  STALE   —— 内容陈旧是因为原始服务器不能正确响应。需要配置proxy_cache_use_stale
  UPDATING —— 内容过期了,因为相对于之前的请求,响应的入口(entry)已经更新,并且proxy_cache_use_stale的updating已被设置
  REVALIDATED —— proxy_cache_revalidate命令被启用,NGINX检测得知当前的缓存内容依然有效(If-Modified-Since或者If-None-Match)
  HIT —— 响应包含来自缓存的最新有效的内容
  d、http响应头cache-control
  当在响应头部中cache-control被配置为private、no-cache、no-store或者set-cookie,不允许代理对资源进行缓存。
  e、nginx对缓存的资源会设置一个key,nginx生成的键的默认格式是类似于下面nginx变量的MD5哈希值:$scheme$proxy_host$request_uri,实际的算法比较复杂。为了改变变量作为基础键,可以使用proxy_cache_key命令。
  proxy_cache_key $proxy_host$request_uri$cookie_jessionid;
  f、缓存指令proxy_cache_valid
  为不同的HTTP返回状态码的资源设置不同的缓存时长。
  命令格式为:
  proxy_cache_valid [code ...] time;
  举例如下:
  proxy_cache_valid 200 302 10m;    #为响应码是200和302的资源,设置缓存时长为10分钟
  proxy_cache_valid 404      1m;    #为响应码是404的资源,设置的缓存的时长为1分钟
  g、缓存清理指令proxy_cache_purge
  二、nginx的限制访问次数
  未完成。。。。。。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-634501-1-1.html 上篇帖子: nginx安全 下篇帖子: Rsyslog实现Nginx日志统一收集
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表