前言:
我们知道Nginx+Tomcat可以实现动静分离,但这并不是最好的解决方案,因为往往带宽会成为瓶颈。
分析网站访问慢的真正原因?
很多情况下往往是静态资源太大,而带宽不足,导致网站加载很慢。
一、 CDN内容分发(解决带宽不足)
二、 减少与服务端的带宽传输(解决静态资源太大)
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及以下不启用gzipgzip vary on;......}

3. 大图片分段拆分
大图片我们通常会采取压缩,但是压缩后还是很大,而且变得很模糊,不推荐。 我们可以通过PS等图像处理工具
将图片拆分成多段,例如淘宝商品的详情页,看起来像一张图,但是实际上是很多张图片通过标签拼接的,此时浏览器可以异步加载图片,提高网页响应速度。
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;#缓存的keyproxy_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本地缓存
需要考虑的问题: