前言:
我们知道Nginx+Tomcat可以实现动静分离,但这并不是最好的解决方案,因为往往带宽会成为瓶颈。
分析网站访问慢的真正原因?
很多情况下往往是静态资源太大,而带宽不足,导致网站加载很慢。
解决方案:
一、 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本地缓存