nginx缓存页面原理:就是把html源码保存到了nginx管理的目录中。

nginx缓存静态页面缺点:数据库修改数据nginx缓存的静态页面不会修改

在URL地址后加上最新更新商品的时间(如果请求地址不一样nginx不会走缓存)。

问题

问题:nginx缓存静态页面怎么区分是哪个页面(哪个商家的页面)?

答:根据请求url进行缓存,如产品详情1的请求为:127.0.0.1/detailed?id=1, 产品详情2的请求为127.0.0.1/detailed?id=2

       nginx中根据自定义的创建缓存文件规则,会创建一个名为1和2的文件,个个文件中存放对应的产品静态页面。

问题:静态页面缓存到nginx后,页面数据做了修改如何更新到nginx中?

答:修改url地址上的时间戳或者使用Lua+OpenResty动态读取后台(京东使用的时间戳方式,通过修改url上的时间戳表示需要重新缓存到nginx),

       nginx缓存的页面(根据请求地址缓存),如果地址上的时间戳改变就放行去请求后台返回数据并再次缓存到nginx中。

场景 - 修改页面后更新缓存:

127.0.0.1/commodity?id=850&updateTime=1568776876341 在后台把轮播图做了改动,修改完成后需要更新数据库这一商品表中的updateTime字段(看自己业务该字段是在数据库、redis还是Es中,就是更新时间,页面请求地址的时候需要带上最新的updateTime字段,nginx发现url和之前不一样就会重新请求后台)。

      重新打开商品列表页,列表中所有商品都是从数据库或Es中查询到的id、updateTime字段,点击某一商品进入商品详情页的url请求:127.0.0.1/commodity? id = id & updateTime = updateTime,这个时候的updateTime就是刚才做了修改时的时间。

配置nginx

1. 替换掉nginx.conf配置文件中的内容:

events {
  #的最大连接数(包含所有连接数)1024
  worker_connections  1024;  ## Default: 1024
}

http{

   # 代理缓存配置,meite_cachedata为缓存存放目录
   proxy_cache_path "./meite_cachedata"  levels=1:2 keys_zone=meitecache:256m inactive=1d max_size=1000g; 
   server {
     listen 80;
     location /{
        #使用缓存名称
        proxy_cache meitecache;
		#对以下状态码实现缓存
        proxy_cache_valid 200 206 304 301 302 1d;
		#缓存的key(缓存的key为请求地址)
        proxy_cache_key $request_uri;
        add_header X-Cache-Status $upstream_cache_status;
		#反向代理地址
        proxy_pass http://127.0.0.1:8080;
      }
  
   }
}

 2. 在nginx目录下创建meite_cachedata文件目录,用于存放静态页面。

nginx响应静态文件时间过长 nginx 静态页面缓存_nginx缓存

测试

nginx端口为80, tomcat端口为8080

tomcat中静态页面存放的位置:

nginx响应静态文件时间过长 nginx 静态页面缓存_nginx响应静态文件时间过长_02

1. 把静态html等页面放到tomcat的webapps目录下,启动tomcat,

127.0.0.1:8080/my/html/index.html,访问到静态页面;

2. 启动配置好的nginx,通过反向代理请求tomcat启动的8080端口,

    访问:127.0.0.1/my/html/index.html 第一次访问自动缓存页面到nginx的meite_cachedata目录中;

nginx响应静态文件时间过长 nginx 静态页面缓存_nginx缓存_03

 3. 测试是否访问的nginx缓存,关闭tomcat,再次访问127.0.0.1/my/html/index.html,发现还是可以访问;

    OK搞定。。。