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端口为80, tomcat端口为8080
tomcat中静态页面存放的位置:
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目录中;
3. 测试是否访问的nginx缓存,关闭tomcat,再次访问127.0.0.1/my/html/index.html,发现还是可以访问;
OK搞定。。。