Nginx实战解决高并发(静态资源缓存)
前言:
我们知道,但这并不是最好的解决方案,因为往往带宽会成为瓶颈。
分析网站访问慢的真正原因?
很多情况下往往是静态资源太大,而带宽不足,导致网站加载很慢。
解决方案:
一、 CDN内容分发(解决带宽不足)
使用第三方OOS(对象存储),如七牛云,阿里云OOS等
二、 减少与服务端的带宽传输(解决静态资源太大)
1. 静态资源手动压缩
例如js文件,我们平时使用的JQuery的*.min.js就是压缩版,我们可以通过百度搜索js在线压缩工具,这种手动的方式其实不推荐。其实我们还可以通过Maven打包压缩,需要添加对应的插件依赖,具体可百度。 原理:其实就是去掉文件中的注释和多余的空白字符
2. 使用Nginx静态资源压缩
原理:使用字典匹配,例如:Nginx将js文件中的function根据一定算法替换成a,浏览器拿到a过后,通过字典查找a就是function,这样就减少了文件中需要存储的字符,其中的实现过程我们并不需要关心。 缺点:相对于自己手动压缩,Nginx压缩相对比较耗费CPU和内存资源;压缩图片也会越压缩越模糊。
Nginx配置:
server{ listen 80; server_name localhost; gzip on; gzip_buffers 32 4K; gzip_comp level 6; gzip_min_length 100; gzip_types application/javascript text/css text/xml; gzip_disable "MSIE [1-6].";#配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip gzip vary on; ... ... }
3. 大图片分段拆分
大图片我们通常会采取压缩,但是压缩后还是很大,而且变得很模糊,不推荐。 我们可以通过PS等图像处理工具将图片拆分成多段,例如淘宝商品的详情页,看起来像一张图,但是实际上是很多张图片通过<img>标签拼接的,此时浏览器可以异步加载图片,提高网页响应速度。
4. 浏览器静态资源版本控制
另外一篇blog专门介绍了: 浏览器缓存原理:http状态码 304 第一次请求会将内容缓存,第二次请求会响应304表示使用本地缓存。 更新服务器静态资源文件的修改时间,浏览器发现最后修改时间大于缓存文件的时间,则使用服务器资源。 静态资源请求url上加时间戳参数
5. 使用Nginx缓存静态页面思想
需要考虑的问题: Redis与数据库一致性问题(MQ订阅blog日志实现 同步数据一致性问题) JVM与Redis缓存一致性问题 Nginx缓存与服务器端真实缓存的一致性问题 (1. 删除Nginx缓存; 2. 商品详情表加版本号字段,详情请求加上版本参数; 3.Lua语言动态渲染模板,控制nginx本地缓存)
实战,使用Nginx缓存商品详情页面?
Nginx核心配置:
##如果是以all开头只做反向代理不缓存到nginx中 location /all{ proxy_pass http://127.0,0,1:8080; index index.html index.htm; } ##如果是以缓存开头的话,缓存到nginx中 location /details{ #使用缓存名称 proxy_cache meitecache; #对以下状态码实现缓存 proxy_cache_valid 200 206 304 301 302 1d; #缓存的key proxy_cache_key $request_uri; add_header X-Cache-Status upstream cache status; proxy_pass http://127.0.0.1:8080; index index.html index.htm; }
Nginx缓存与服务器端真实缓存的一致性问题 :
- 删除Nginx缓存,不推荐;
- 商品详情表加版本号字段,详情请求加上版本参数;
- Lua语言动态渲染模板,控制nginx本地缓存
上一篇:
IDEA上Java项目控制台中文乱码