Nginx高级课程扩容(五)

本文详细探讨了浏览器缓存、CDN缓存策略,以及Nginx缓存的原理和配置,涉及强制缓存、协商缓存、ETag和Last-Modified的应用,以及如何管理和优化缓存以提高网站性能和用户体验。
摘要由CSDN通过智能技术生成

多级缓存

静态资源缓存
浏览器缓存
什么时候可以用缓存?
1 . 不常改变的内容
2 . 过期时间
3 . 针对post/get请求都可以
4 . 存储位置
5 . 磁盘使用空间限制
观察京东缓存及加载速度
● deskcache
字面理解是从内存中,其实也是字面的含义,这个资源是直接从内存中拿到的,**不会请求服务器**一般已经加载过该资源且缓存在了内存当中,当关闭该页面时,此资源就被内存释放掉了,再次重新打开相同页面时不会出现from memory cache的情况
● memorycache
是从磁盘当中取出的,也是在已经在之前的某个时间加载过该资源,**不会请求服务器**但是此资源不会随着该页面的关闭而释放掉,因为是存在硬盘当中的,下次打开仍会from disk cache
Age
是CDN添加的属性表示在CDN中缓存了多少秒
via
用来标识CDN缓存经历了哪些服务器,缓存是否命中,使用的协议
Nginx默认缓存
Nginx版本不同会默认配置
强制缓存与协商缓存
强制缓存:直接从本机读取,不请求服务器
协商缓存:发送请求header中携带Last-Modified,服务器可能会返回304 Not Modified
浏览器强制缓存
cache-control
http1.1的规范,使用max-age表示文件可以在浏览器中缓存的时间以秒为单位

在浏览器和服务器端验证文件是否过期的时候,浏览器在二次请求的时候会携带IF-Modified-Since属性
Expires
过期时间 

expires 30s; #缓存30秒
expires 30m; #缓存30分钟
expires 2h; #缓存2小时
expires 30d; #缓存30天

协商缓存
last-modified
etag
http1.1支持
在HTTP协议中If-Modified-Since和If-None-Match分别对应Last-Modified和ETag
Entity Tag 的缩写,中文译过来就是实体标签的意思.
HTTP中并没有指定如何生成ETag,哈希是比较理想的选择。
在计算Etag的时候,会产生CPU的耗费,所以也可以用时间戳,但这样直接使用Last-Modified即可。
ETag 用来校验用户请求的资源是否有变化,作用和lastmodified很像,区别是lastmodified精确到秒,ETag可以用hash算法来生
成更精确的比对内容。
当用户首次请求资源的时候返回给用户数据和200状态码并生成ETag,再次请求的时候服务器比对ETag,没有发生变化的话返
回304
Cache-Control直接是通过不请求来实现,而ETag是会发请求的,只不过服务器根据请求的东西的内容有无变化来判断是否返回
请求的资源
总结:
cache-control expires 强制缓存
页面首次打开,直接读取缓存数据,刷新,会向服务器发起请求
etag lastmodify 协商缓存
没发生变化 返回304 不发送数据
last-modified 与ssi的冲突
浏览器缓存原则
● 多级集群负载时last-modified必须保持一致
● 还有一些场景下我们希望禁用浏览器缓存。比如轮训api上报数据数据
● 浏览器缓存很难彻底禁用,大家的做法是加版本号,随机数等方法。
● 只缓存200响应头的数据,像3XX这类跳转的页面不需要缓存。
● 对于js,css这类可以缓存很久的数据,可以通过加版本号的方式更新内容
● 不需要强一致性的数据,可以缓存几秒
● 异步加载的接口数据,可以使用ETag来校验。
● 在服务器添加Server头,有利于排查错误
● 分为手机APP和Client以及是否遵循http协议
● 在没有联网的状态下可以展示数据
● 流量消耗过多
● 提前下发 避免秒杀时同时下发数据造成流量短时间暴增
● 兜底数据 在服务器崩溃和网络不可用的时候展示
● 临时缓存 退出即清理
● 固定缓存 展示框架这种,可能很长时间不会更新,可用随客户端下发
● 首页有的时候可以看做是框架 应该禁用缓存,以保证加载的资源都是最新的
● 父子连接 页面跳转时有一部分内容不需要重新加载,可用从父菜单带过来
● 预加载 某些逻辑可用判定用户接下来的操作,那么可用异步加载那些资源
● 漂亮的加载过程 异步加载 先展示框架,然后异步加载内容,避免主线程阻塞 

GEOip

1 下载数据库
官网需注册登录
下载数据库
maxmind.com
2 安装依赖
官方git
https://github.com/maxmind/libmaxminddb
下载后执行编译安装之后

$ echo /usr/local/lib >> /etc/ld.so.conf.d/local.conf
$ ldconfig

Nginx模块
https://github.com/leev/ngx_http_geoip2_module
更完整的配置可参考官方文档
http://nginx.org/en/docs/http/ngx_http_geoip_module.html#geoip_proxy
Nginx配置

geoip2 /root/GeoLite2-ASN_20220524/GeoLite2-ASN.mmdb {
$geoip2_country_code country iso_code;
}
add_header country $geoip2_country_code;

正向代理与反向代理缓存
正向代理配置

proxy_pass $scheme://$host$request_uri;
resolver 8.8.8.8;

 代理https请求
需要第三方模块
https://github.com/chobits/ngx_http_proxy_connect_module
配置

server {
listen 3128;
 # dns resolver used by forward proxying
resolver 8.8.8.8;
# forward proxy for CONNECT request
proxy_connect;
proxy_connect_allow 443 563;
proxy_connect_connect_timeout 10s;
proxy_connect_read_timeout 10s;
proxy_connect_send_timeout 10s;
# forward proxy for non-CONNECT request
location / {
proxy_pass http://$host;
proxy_set_header Host $host;
}
}

proxy缓存
官网解释
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache
配置

http模块:
proxy_cache_path /ngx_tmp levels=1:2 keys_zone=test_cache:100m inactive=1d max_size=10g ;
location模块:
add_header Nginx-Cache "$upstream_cache_status";
proxy_cache test_cache;
proxy_cache_valid 168h; 

proxy_cache_use_stale
默认off
在什么时候可以使用过期缓存
可选 error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404
| http_429 | off
proxy_cache_background_update
默认off
运行开启子请求更新过期的内容。同时会把过期的内容返回给客户端
proxy_no_cache proxy_cache_bypass
指定什么时候不使用缓存而直接请求上游服务器
proxy_no_cache $cookie_nocache $arg_nocache$arg_comment;
proxy_no_cache $http_pragma $http_authorization;
如果这些变量如果存在的话不为空或者不等于0,则不使用缓存
proxy_cache_convert_head
默认 on
是否把head请求转换成get请求后再发送给上游服务器 以便缓存body里的内容
如果关闭 需要在 cache key 中添加 $request_method 以便区分缓存内容
proxy_cache_lock
默认off
缓存更新锁
proxy_cache_lock_age
默认5s
缓存锁超时时间
断点续传缓存 range
当有完整的content-length之后即可断点续传
在反向代理服务器中需向后传递header
proxy_set_header Range $http_range;
proxy_cache_key中增加range
proxy_cache_max_range_offset
range最大值,超过之后不做缓存,默认情况下 不需要对单文件较大的资源做缓存
proxy_cache_methods
默认 head get
proxy_cache_min_uses
默认1
被请求多少次之后才做缓存
proxy_cache_path
path 指定存储目录
以cache_key取md5值
● levels=1:2
目录层级数及目录名称位数
取mdb5后几位
TMPFS
● use_temp_path
默认创建缓存文件时,先向缓冲区创建临时文件,再移动到缓存目录
是否使用缓冲区
● inactive
指定时间内未被访问过的缓存将被删除
缓存清理
purger
需要第三方模块支持
https://github.com/FRiCKLE/ngx_cache_purge
配置 

location ~ /purge(/.*) {
proxy_cache_purge test_cache $1;
}
自定义cachekey
proxy_cache_key $uri;

proxy_cache_key
默认 $scheme$proxy_host$request_uri
缓存的key
proxy_cache_revalidate
如果缓存过期了,向上游服务器发送“If-Modified-Since” and “If-None-Match来验证是否改变,如果没有就不需要重新下载资
源了
proxy_cache_valid
可以针对不容http状态码设置缓存过期时间
不设置状态码会默认200, 301, 302 

proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;

 

  • 15
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狠情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值