nginx 配置缓存


Posted in Servers onMay 11, 2022

前言

缓存的使用在各种项目中非常普遍,nginx作为一款高效的代理服务器,也提供了强大的缓存机制,试想在一些电商网站中,那些静态的html,js,css文件登数量非常庞大的情况下,加载页面的时候,如果没有缓存的话,页面将会非常慢,在这种情况下,就可以考虑使用nginx提供的缓存功能的配置;

Nginx的web缓存

  • Nginx从0.7.48版提供缓存功能。
  • Nginx是基于Proxy Store来实现的,其原理是把URL及相关组合当做Key,在使用MD5算法对Key进行哈希,得到硬盘上对应的哈希目录路径,从而将缓存内容保存在该目录中。
  • 它可以支持任意URL连接,同时也支持404/301/302这样的非200状态码。Nginx即可以支持对指定URL或者状态码设置过期时间,也可以使用purge命令来手动清除指定URL的缓存。

Nginx缓存设置相关指令

Nginx的web缓存服务主要是使用ngx_http_proxy_module模块相关指令集来完成,接下来把常用的指令做一下总结:

proxy_cache_path

该指定用于设置缓存文件的存放路径

语法格式

proxy_cache_path path [levels=number]
keys_zone=zone_name:zone_size [inactive=time]
[max_size=size];

各个参数说明

path

缓存路径地址

/usr/local/proxy_cache

levels

指定该缓存空间对应的目录,最多可以设置3层,每层取值为1|2如 :

levels=1:2 缓存空间有两层目录,第一次是1个字母,第二次是2个 字母

举例说明:

zcy[key]通过MD5加密以后的值为 : 43c8233266edce38c2c9af0694e2107d

最终生成的缓存目录含义为:

  • levels=1:2 最终的存储路径为/usr/local/proxy_cache/d/07;
  • levels=2:1:2 最终的存储路径为/usr/local/proxy_cache/7d/0/21;
  • levels=2:2:2 最终的存储路径为??/usr/local/proxy_cache/7d/10/e2

keys_zone

用来为这个缓存区设置名称和指定大小

举例说明:

keys_zone=zcy:200m 缓存区的名称是zcy,大小为200M,1M 大概能存储8000个keys

inactive

指定缓存的数据多次时间未被访问就将被删除

举例说明

inactive=1d 缓存数据在1天内没有被访问就会被删除

max_size

设置最大缓存空间,如果缓存空间存满,默认会覆盖缓存时间最长的资源,如:max_size=20g

配置实例

proxy_cache_path D:\\dev-tools\\nginx\\nginx-1.16.1\\caches\\proxy_cache keys_zone=zcy:200m levels=1:2:1 inactive=1d max_size=20g;

实验演示

下面在本地的nginx目录下创建一个caches的目录,将上面的这段配置加到nginx.conf配置文件中,注意加到http块中:

nginx 配置缓存

然后重启nginx服务,可以看到在该目录下生成了 proxy_cache 目录,即为缓存的目录

nginx 配置缓存

其他配置参数说明

1、proxy_cache

该指令用来开启或关闭代理缓存,如果是开启则自定使用哪个缓存区来
进行缓存;

nginx 配置缓存

2、proxy_cache_key

该指令用来设置web缓存的key值,Nginx会根据key值MD5哈希存缓存;

nginx 配置缓存

3、proxy_cache_valid

该指令用来对不同返回状态码的URL设置不同的缓存时间

nginx 配置缓存

例如:

  • proxy_cache_valid 200 302 10m;
  • proxy_cache_valid 404 1m; 为200和302的响应URL设置10分钟缓存,为404的响应URL设置1分钟缓 存;
  • proxy_cache_valid any 1m; 对所有响应状态码的URL都设置1分钟缓存;

4、proxy_cache_min_uses

该指令用来设置资源被访问多少次后被缓存

nginx 配置缓存

5、proxy_cache_methods

该指令用户设置缓存哪些HTTP方法

nginx 配置缓存

缓存配置案例展示

环境准备

1、tomcat8.0,提前启动服务;

nginx 配置缓存

2、nginx服务,提前启动;

nginx 配置缓存

3、提前准备一个静态文件

可以是html,js或图片登静态资源,然后放到tomcat的webapps目录下的html目录下

nginx 配置缓存

确保通过tomcat的8080端口可以访问到该静态资源文件

nginx 配置缓存

配置步骤

打开nginx的配置文件,修改nginx.conf,添加如下内容(注意下面的配置放到http模块下);

我们的需求是:通过访问 nginx监听的本地的8081端口,可以直接访问到tomcat下的这个静态html文件,然后测试缓存目录下的文件是否生成和生效;

proxy_cache_path D:\\dev-tools\\nginx\\nginx-1.16.1\\caches\\proxy_cache keys_zone=zcy:200m levels=1:2:1 inactive=1d max_size=20g;
   server {
         listen    8081;
         server_name    localhost ;
         location  /  {
           proxy_cache zcy;
           proxy_cache_key zcy;
           proxy_cache_valid 200 1d;
           add_header nginx-cache "$upstream_cache_status";   #浏览器可查看缓存的命中状态
           proxy_pass  http://localhost:8080/html/hello.html ;
         }
     }

添加完毕后,使用 : nginx -s reload命令使配置生效,访问 : localhost:8081,可以看到,直接显示了该静态资源

nginx 配置缓存

这时候去本地的缓存目录下,可以看到已经生成了该静态文件相关的缓存资源;

nginx 配置缓存

如何验证通过浏览器访问的时候确实是走了缓存呢?我们打开F12通过下面的这个地方就可以看到

nginx 配置缓存

这时候我们去缓存目录下删掉里面的文件后再次测试,看到这个状态变成了 “MISS”

nginx 配置缓存

Nginx设置资源不缓存

前面初步完成了Nginx作为web缓存服务器的使用的配置说明;

但是在某些场景下,并不是所有的数据都适合进行缓存。比如说对于一些经常发生变化的数据。如果进行缓存的话,就很容易出现用户访问到的数据不是服务器真实的数据。所以对于这些资源我们在缓存的过程中就需要进行过滤,不进行缓存;

Nginx也提供了这块的功能设置,需要使用到如下两个指令:

proxy_no_cache #该指令是用来定义不将数据进行缓存的条件

nginx 配置缓存

配置实例:

proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;

案例展示

仍然以上面的案例配置为例,我们在nginx.conf配置中添加如下内容:

nginx 配置缓存

然后重启nginx,下面做过简单的测试吧

删除本地缓存目录下的文件后,访问html资源,这次在访问的url后面添加上面的配置参数

nginx 配置缓存

可以看到不管访问多少,都不会对访问到的静态资源进行缓存,即在请求的URL中,拼接上面的3个参数中任意一个即可;

方式2:通过if 条件语句进行设置

即在location中添加 if 条件表达式,当访问的URL中带有 .html结尾的后缀时,设置一个mynocache 的变量,并把这个变量设置到proxy_no_cache 中

server {
         listen    8081;
         server_name    localhost ;
         location  /  {
           if ($request_uri ~ /.*\.html$){ 
                set $mynocache 1;
           }
           proxy_cache zcy;
           proxy_cache_key zcy;
           proxy_cache_valid 200 1d;
        	proxy_no_cache $cookie_nocache $arg_nocache $arg_comment $mynocache;
           add_header nginx-cache "$upstream_cache_status";
           proxy_pass  http://localhost:8080/html/hello.html ;
         }
     }

proxy_cache_bypass

该指令是用来设置不从缓存中获取数据的条件,即访问的资源会被缓存,但是请求之后的取值不从缓存中获取;

nginx 配置缓存

配置样例

proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;

上述两个指令都有一个指定的条件,这个条件可以是多个,并且多个条件中至少有一个不为空且不等于"0",则条件满足成立。上面给的配置实例是从官方网站获取的,里面使用到了三个变量,分别是 c o o k i e n o c a c h e 、 cookie_nocache、 cookien​ocache、arg_nocache、$arg_comment

实例展示

仍然以上面的配置为例进行说明,当使用proxy_cache_bypass 的时候,需要将proxy_no_cache注释一下

proxy_cache_path D:\\dev-tools\\nginx\\nginx-1.16.1\\caches\\proxy_cache keys_zone=zcy:200m levels=1:2:1 inactive=1d max_size=20g;
   server {
         listen    8081;
         server_name    localhost ;
         location  /  {
           #if ($request_uri ~ /.*\.js$){ 
           #     set $mynocache 1;
           #}
           proxy_cache zcy;
           proxy_cache_key zcy;
           proxy_cache_valid 200 1d;
        	#proxy_no_cache $cookie_nocache $arg_nocache $arg_comment $mynocache;
    	proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;
           add_header nginx-cache "$upstream_cache_status";
           proxy_pass  http://localhost:8080/html/hello.html ;
         }
     }

下面来做一个测试吧,首先清理掉缓存目录下的文件,然后使用后面拼接参数的形式访问下,结果发现,缓存目录下正常生成了缓存文件,但是此时响应的请求资源并未走缓存

nginx 配置缓存

到此这篇关于nginx 缓存使用详解的文章就介绍到这了!


Tags in this post...

Servers 相关文章推荐
详解Nginx启动失败的几种错误处理
Apr 01 Servers
使用goaccess分析nginx日志的详细方法
Jul 09 Servers
详解Nginx 被动检查服务器的存活状态
Oct 16 Servers
Nginx性能优化之Gzip压缩设置详解(最大程度提高页面打开速度)
Feb 12 Servers
忘记Grafana不要紧2种Grafana重置admin密码方法详细步骤
Apr 07 Servers
Windows Server 2012 修改远程默认端口3389的方法
Apr 28 Servers
Windows server 2012搭建FTP服务器
Apr 29 Servers
讨论nginx location 顺序问题
May 30 Servers
使用Apache Camel表达REST服务的方法
Jun 10 Servers
详解apache编译安装httpd-2.4.54及三种风格的init程序特点和区别
Jul 15 Servers
Linux中一对多配置日志服务器的详细步骤
Jul 23 Servers
源码安装apache脚本部署过程详解
Sep 23 Servers
Nginx的gzip相关介绍
May 11 #Servers
详解如何使用Nginx解决跨域问题
May 06 #Servers
配置nginx负载均衡
May 06 #Servers
tomcat下部署jenkins的方法
排查Tomcat进程假死的问题
May 06 #Servers
使用Nginx的访问日志统计PV与UV
Tomcat配置访问日志和线程数
May 06 #Servers
You might like
乐信RP2100的电路分析和打磨
2021/03/02 无线电
PHP简洁函数小结
2011/08/12 PHP
Php header()函数语法及使用代码
2013/11/04 PHP
PHP5.5和之前的版本empty函数的不同之处
2014/06/13 PHP
PHP Static延迟静态绑定用法分析
2016/03/16 PHP
总结的一些PHP开发中的tips(必看篇)
2017/03/24 PHP
JavaScript 模拟类机制及私有变量的方法及思路
2013/07/10 Javascript
JS复制内容到剪切板的实例代码(兼容IE与火狐)
2013/11/19 Javascript
jquery 字符串切割函数substring的用法说明
2014/02/11 Javascript
JS正则表达式之非捕获分组用法实例分析
2016/12/28 Javascript
详解基于webpack和vue.js搭建开发环境
2017/04/05 Javascript
JS自定义函数实现时间戳转换成date的方法示例
2017/08/27 Javascript
实现一个完整的Node.js RESTful API的示例
2017/09/29 Javascript
详解vue-admin和后端(flask)分离结合的例子
2018/02/12 Javascript
解决vue中虚拟dom,无法实时更新的问题
2018/09/15 Javascript
[57:18]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#3VP VS VG
2016/03/03 DOTA
[01:44]Ti10举办地公布
2019/08/25 DOTA
Python lxml模块安装教程
2015/06/02 Python
Python程序中用csv模块来操作csv文件的基本使用教程
2016/03/03 Python
Python动态语言与鸭子类型详解
2019/07/01 Python
python用for循环求和的方法总结
2019/07/08 Python
浅谈SciPy中的optimize.minimize实现受限优化问题
2020/02/29 Python
Python xpath表达式如何实现数据处理
2020/06/13 Python
巴西宠物店在线:Geração Pet
2017/05/31 全球购物
德国户外商店:eXXpozed
2020/07/25 全球购物
幼儿教师个人求职信范文
2013/09/21 职场文书
四年大学生活的个人自我评价
2013/12/11 职场文书
食品销售计划书
2014/04/26 职场文书
优秀团干部个人事迹
2014/05/29 职场文书
三八节标语
2014/06/27 职场文书
2014年测量员工作总结
2014/12/12 职场文书
2015年员工工作表现评语
2015/03/25 职场文书
2015年打非治违工作总结
2015/04/02 职场文书
掌握一个领域知识,高效学习必备方法
2019/08/08 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers
漫画「日和酱的要求是绝对的」第3卷封面公开
2022/03/21 日漫