购物网站开发设计思路,什么是网站版面布局,深圳网站设计哪里好,北京王府井步行街上来往最多的是什么人概述
在负载均衡的过程中#xff0c;有一个比较重要的概念#xff0c;就是缓存利用缓存可以很好协调Nginx在客户端和上游服务器之间的速度不匹配的矛盾从而很好的解决整体系统的响应速度 如果用户需要通过Nginx获取某一些内容的时候#xff0c;发起一个request请求这个请求…概述
在负载均衡的过程中有一个比较重要的概念就是缓存利用缓存可以很好协调Nginx在客户端和上游服务器之间的速度不匹配的矛盾从而很好的解决整体系统的响应速度 如果用户需要通过Nginx获取某一些内容的时候发起一个request请求这个请求到了Nginx之后静态内容会直接返回动态内容会转发至应用程序服务器后端应用服务器再处理完这样一个请求器会封装响应包体再返回给我们的NginxNginx 收到 response 包体之后再一并的把这些内容返回给我们的用户这里的问题在于Nginx 处理能力很强但是上游的服务器它是处理动态内容的而且在后端通常情况下可能还有一些数据库服务器它还需要将请求再去找数据库服务器获取内容之后就这段请求处理的时候是非常慢因此就有一个矛盾当用户发起请求的时候很快到达Nginx但这个内容返回之前可能需要经经过长的时时间用户体验并非取决于前一段而是取决于整个系统中最慢的那一段想要提升用户体验的话缓存就做了这样一个思路 Nginx 提供一些缓存能力当第一次request的请求到达Nginx的时候Nginx可以依据一定的缓存策略发送请求给应用服务器当应用服务器处理完请求封装包底返回给Nginx的时候Nginx 在返回给客户端之前它会依据缓存的策略将某一部分信息先缓存到Nginx自身的cache中(Nginx 服务器的内存中开辟的一段空间)比如, 请求一个图片或某一些动态内容都可以把它缓存到这样一个cache中当用户第一次请求的时候可能在缓存中是没有对应的这样一些内容的这个时候Nginx必须要发去请求到后端应用服务器获取但是当第一次获取到这些内容之后会把这些内容放到cache中等到下一个用户请求的时候发现你这个URL请求的是同样的内容Nginx不会再向后端应用服务器发送请求而是直接将将自身内存中的cache中的一些信息直接返回给客户端中这对于提升整个用户体验来说是非常关键的在互联网时代有一句话叫缓存为王尤其是并发量很大的场景下这已经不是一个策略问题而是一个必须要做的事情
缓存分类 1 客户端缓存 所谓客户端缓存就是指我们的用户的浏览器那客户端我们对于用户来说它的浏览器就是一个客户端它发送请求到Nginx服务器我们先来看一下客户端缓存优点直接在本地获取内容没有网络消耗 响应是最快的用户和Nginx之间通常是经过运营商的网络的这样很好的避免了这样一些网络请求这样它可以极大的减少我们网络消耗的开销缺点也是很明显当用户只启用了客户端缓存的时候只有这个用户可以使用这些缓存而且这些缓存也有可能造成一些数据不一致的问题
2 服务端缓存 它的优势相比客户端来说它就是对所有的用户都能够生效另外一点它还可以有效的去降低上游应用服务器的一个压力缓解并发能力差的问题缺点就是仍然有一些网络消耗
3 最佳实践
同时启用客户端缓存和服务端缓存
相关指令
1 proxy_cache 指令
语法proxy_cache zone | off; zone 是共享内存中开辟的空间 默认值proxy_cache off;上下文http、server、location
2 proxy_cache_path 指令 语法proxy_cache_path path [ levellevels ] [ use_temp_pathon/off] keys_zonename:size [inactivetime] [max_sizesize] [manager_filesnumber] [manager_sleeptime] [manager_thresholdtime] [loader_filesnumber] [loader_sleeptime] [loader_thresholdtime] [purgeron|off] [purger_filesnumber] [purger_sleeptime] [purger_thresholdtime]; 默认值proxy_cache_path off; 上下文http 参数含义 可选参数含义path缓存文件的存放路径levelpath的目录层级use_temp_pathoff直接使用path路径on使用proxy_temp_path路径keys_zonename是共享内存名称size是共享内存大小inactive在指定时间内没有被访问缓存会被清理默认10分钟max_size设定最大的缓存文件大小超过将由CM(Cache Manager)清理manager_filesCM清理一次缓存文件最大清理文件数默认100manager_sleepCM清理一次后进程的休眠时间默认200毫秒manager_thresholdCM清理一次最长耗时默认50毫秒loader_filesCL(Cache Loader) 载入文件到共享内存每批最多文件数默认100loader_sleepCL加载缓存文件到内存后进程休眠时间默认200毫秒loader_thresholdCL每次载入文件到共享内存的最大耗时默认50毫秒
3 proxy_cache_key 指令
决定缓存内容保存的key信息语法proxy_cache_key string;默认值proxy_cache_key $scheme $proxy_host $request_uri上下文http、server、location
4 proxy_cache_valid 指令
语法proxy_cache_valid [ code … ] time; 这里的 code 是 http 的状态码 默认值-上下文http、server、location配置示例proxy_cache_valid 60m; # 只对200、301、302响应码缓存
5 upstream_cache_status 变量
变量名upstream_cache_status MISS: 未命中缓存HIT: 命中缓存EXPIRED: 缓存过期STALE: 命中了陈旧缓存REVALIDDATED: Nginx验证陈旧缓存依然有效UPDATING: 内容陈旧但正在更新BYPASS: 响应从原始服务器获取
缓存基本指令配置示例 1 环境准备 Nginx 服务器准备192.168.184.240 proxy_cache_path /opt/nginx/cache_temp levels2:2 keys_zonecache_zone:30m max_size32g inactive60m use_temp_pathoff;upstream cache_server {server 192.168.184.20:1010;server 192.168.184.20:1011;
}server {listen 80;server_name cache.baidu.com;location / {proxy_cache cache zone; # 开启缓存功能proxy_cache_valid 200 5m; # 对200状态码的缓存 5分钟proxy_cache_key $scheme$proxy_host$request_uri # 这个是缓存文件中的 key 值可以自行修改add_header Nginx-Cache-Status $upstream cache status; # 缓存是否命中的变量带到响应头上proxy_pass http://cache server;}
}levels2:2 第一个2表示目录命名时字符串长度第二个2表示目录的层次keys_zonecache_zone:30m 这里的30m是可用的共享内存大小, 1m可缓存8000个keyinactive60m 60分钟内缓存没有被使用则清理 应用服务器准备192.168.184.20 server {listen 1010;root /opt/html/1010;add_header X-Accel-Expires 5 # 告诉下游Nginx 只能缓存 5slocation / {index index.html index.htm;}
}server {listen 1011;root /opt/html/1011;add_header X-Accel-Expires 5location / {index index.html index.htm;}
}文件/opt/html/1010/cache.txt 内容为cc-1010文件/opt/html/1011/cache.txt 内容为cc-1011 客户端访问测试 已经配置nginx服务器hosts 为 cache.baidu.com可直接访问多次执行$ curl cache.baidu.com/cache.txt 可知只会分配到一台服务器上执行 $ curl cache.baidu.com/cache.txt -I 重启nginx后也就是第一次访问Nginx-Cache-Status: MISS值是 MISS到了第二次这个值就是 HIT在 cache_temp/ 目录中会发现一个两字符的两层级目录例如e4/97 在这个目录下还有一个hash文件就是cache.txt的缓存文件等到5s以后再次访问就会失效, 值变成 EXPIRED
配置 Nginx 不缓存特定内容 1 proxy_no_cache 指令
对于特定场景不去缓存如购物网站商品数量不缓存语法 proxy_no_cache string; 引用某一个特定变量有值则不缓存 默认值 -上下文http、server、location
2 proxy_cache_bypass 指令
配置不使用缓存而是路由到上游服务器语法 proxy_cache_bypass string;默认值 -上下文http、server、location
3 Nginx 配置 proxy_cache示例
proxy_cache_path /opt/nginx/cache_temp levels2:2 keys_zonecache_zone:30m max_size32g inactive60m use_temp_pathoff;upstream cache_server {server 192.168.184.20:1010;server 192.168.184.20:1011;
}server {listen 80;server_name cache.baidu.com;# 注意这里if ($request_uri ~ \.(txt | text)$ ) {set $cookie_name no cache;}location / {proxy_cache cache zone; # 开启缓存功能# 注意这里的添加 --- 开始proxy_no_cache $cookie_name; # 这里引用 cookie_name # 注意这里的添加 --- 结束proxy_cache_valid 200 5m; # 对200状态码的缓存 5分钟proxy_cache_key $scheme$proxy_host$request_uri # 这个是缓存文件中的 key 值可以自行修改add_header Nginx-Cache-Status $upstream cache status; # 缓存是否命中的变量带到响应头上proxy_pass http://cache server;}
}这类请求会对 txt/text 的文件不适用缓存, 都是 MISS对其他文件使用缓存缓存的标志值是MISS / HIT / EXPIRED不再做测试说明
缓存失效降低上游压力策略
当缓存失效的时候如何去降低请求直接穿透Nginx从而导致上游应用服务器压力大的这样一个场景这里有两种处理机制 合并源请求启用陈旧缓存
1 合并源请求 当用户发送很多并发请求到Nginx的时候假定这个时候Nginx重启了重启之后假如缓存整体失效导致请求经过 Nginx 直接透传给后端的应用服务器当并发请求量很大的情形下由于Nginx 处理能力和后端处理能力不匹配可能会导致很多的请求穿透Nginx到达后端这些并发请求很可能会直接导致上游的服务器瘫痪掉为了避免这种情形的发生, 对于Nginx 也采取了一些机制
proxy_cache_lock 指令
收到的多个请求会有一个请求进入应用服务器其他请求原地等待缓存语法proxy_cache_lock on | off;默认值proxy_cache_lock off;上下文http、server、location这个多个请求指的是同一请求的多个请求 1.2 proxy_cache_lock_timeout 指令
这个和1.1 一起使用设置锁定的超时时间语法proxy_cache_lock_timeout time;默认值proxy_cache_lock_timeout 5s;上下文http、server、location比如这里有一个场景比如说你第一个请求过来之后三个请求之前设定了 proxy_cache_lock其中有一个请求到达了应用服务器假如说由于某些原因长时间有应用服务器故障不返回五秒钟到了之后后端的这两个请求依然会经过Nginx转发两个请求到应用服务器这个是 这个 proxy_cache_lock_timeout 指令的作用但是这个还会有弊端比如现在是三个请求是5W个如果把第一个请求分发给后端的应用服务器但超时了接下来可能有四万九千九百九十九的这样请求会直接由Nginx再次分发给应用服务器在这样一种场景下它依然会对应用服务造成很大的压力所以说, 这个设定在某些特殊场景下就失去了意义为了避免这样一种情形的发生引入下面的指令
1.3 proxy_cache_lock_age 指令
这个和1.2不同当一个请求超时后再发另一个请求尝试接着继续尝试语法proxy_cache_lock_age time;默认值proxy_cache_lock_age 5s;上下文http、server、location
1.4 总结 以上三个参数就是通过合并原请求来规避了穿透Nginx这样一种情形的发生从而避免缓存失效时给我们的应用服务造成极大的一个压力 在具体的环境配置中我们直接这样写就可以了 proxy_cache_path /opt/nginx/cache_temp levels2:2 keys_zonecache_zone:30m max_size32g inactive60m use_temp_pathoff;upstream cache_server {server 192.168.184.20:1010;server 192.168.184.20:1011;
}server {listen 80;server_name cache.baidu.com;# 注意这里if ($request_uri ~ \.(txt | text)$ ) {set $cookie_name no cache;}location / {proxy_cache cache zone; proxy_no_cache $cookie_name;proxy_cache_valid 200 5m;proxy_cache_key $scheme$proxy_host$request_uriadd_header Nginx-Cache-Status $upstream cache status;proxy_pass http://cache server;# 关注如下proxy_cache_lock on;proxy_cache_lock_timeout 5sproxy_cache_lock_age 5s}
}以上三个指令一起加上就可以完成合并原请求的实践
2 ) 启用陈旧缓存
缓存失效是降低上游服务压力的另外一种方法: 启用陈旧缓存 因为 Nginx 直接转发这样一些并发请求的话可能会对上面的应用服务器造成一个致命的压力如果这么多并发请求过来有可能后面的这个应用服务器就直接给摊掉了因此我们可以这样来做 虽然Nginx的缓存已经失效了, 但是比如说我第一个请求过来以后Nginx 会把第一个请求转发给后面的应用服务器这个时候去请求更新本地缓存就获取内容了这个时候假如后面又有很多的请求过来了跟第一个请求都请求的是同一个资源, 后面的这样一些请求就没必要再转发给后面应用服务器了, 暂时等待第一个请求结果 虽然这样得到的不是实时的是有些陈旧的但是可以尽量避免并发请求全部透传到后端给上网应用服务造成的压力对于某一些对数据一致性要求没那么高的场景来说的话是可以的
2.1 proxy_cache_use_stale 指令
语法proxy_cache_use_stale error| timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | off …;默认值proxy_cache_use_stale off;上下文http、server、location可选参数 可选参数含义error与上游建立连接、发送请求、读取响应头出错时timeout与上游建立连接、发送请求、读取响应头超时时invalid_header无效头部时updating缓存过期正在更新时http_500返回状态码500时http_502返回状态码502时http_503返回状态码503时http_504返回状态码504时http_403返回状态码403时http_404返回状态码404时http_429返回状态码429时 这个指令可以用来在特定的条件下去启用Nginx已有的陈旧的缓存虽然可能这些缓存已经失效但是对于某一些对数据一致性要求没有那么高的应用来说能够返回一个结果, 远远比直接返回404给客户的用户体验是要好的多它后面有很多参数每一个参数就是一种场景 比如说针对 error timeout 或者是invalid_header, 以及 updating后面还有很多不同的HTTP返回状态码的时候都可启用陈旧缓存 这个指令和对上游应用服务进行容错指令 proxy_next_upstream 很相似
2.2 proxy_cache_background_update 指令
缓存更新时在后台执行语法proxy_cache_background_update on | off; 设置为 off, 第一个请求过来Nginx发现缓存失效第一个请求被Nginx转发到上游服务器等待获取结果并缓存设置为 on, 第一个请求过来会直接使用Nginx缓存不管是否失效Nginx自身会发起请求到应用服务器去更新资源这种设置为 on 是用户体验比较好的 默认值proxy_cache_background_update off;上下文http、server、location
2.3 配置示例
proxy_cache_path /opt/nginx/cache_temp levels2:2 keys_zonecache_zone:30m max_size32g inactive60m use_temp_pathoff;upstream cache_server {server 192.168.184.20:1010;server 192.168.184.20:1011;
}server {listen 80;server_name cache.baidu.com;# 注意这里if ($request_uri ~ \.(txt | text)$ ) {set $cookie_name no cache;}location / {proxy_cache cache zone; proxy_no_cache $cookie_name;proxy_cache_valid 200 5m;proxy_cache_key $scheme$proxy_host$request_uriadd_header Nginx-Cache-Status $upstream cache status;proxy_pass http://cache server;proxy_cache_lock on;proxy_cache_lock_timeout 5sproxy_cache_lock_age 5s# 关注如下proxy_cache_use_stale error timeout updating; # 这里配置三个proxy_cache_background_update on;}
}