前言:

我们知道Nginx+Tomcat可以实现动静分离,但这并不是最好的解决方案,因为往往带宽会成为瓶颈。

分析网站访问慢的真正原因?

很多情况下往往是静态资源太大,而带宽不足,导致网站加载很慢。

解决方案:

一、 CDN内容分发(解决带宽不足)

使用第三方OOS(对象存储),如七牛云,阿里云OOS等

二、 减少与服务端的带宽传输(解决静态资源太大)

1. 静态资源手动压缩

例如js文件,我们平时使用的JQuery的*.min.js就是压缩版,我们可以通过百度搜索js在线压缩工具,这种手动的方式其实不推荐。其实我们还可以通过Maven打包压缩,需要添加对应的插件依赖,具体可百度。 原理:其实就是去掉文件中的注释和多余的空白字符

2. 使用Nginx静态资源压缩

原理:使用字典匹配,例如:Nginx将js文件中的function根据一定算法替换成a,浏览器拿到a过后,通过字典查找a就是function,这样就减少了文件中需要存储的字符,其中的实现过程我们并不需要关心。 缺点:相对于自己手动压缩,Nginx压缩相对比较耗费CPU和内存资源;压缩图片也会越压缩越模糊。

Nginx配置:

  1. server{
  2. listen 80;
  3. server_name localhost;
  4. gzip on;
  5. gzip_buffers 32 4K;
  6. gzip_comp level 6;
  7. gzip_min_length 100;
  8. gzip_types application/javascript text/css text/xml;
  9. gzip_disable "MSIE [1-6]\.";#配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip
  10. gzip vary on;
  11. ...
  12. ...
  13. }

Nginx实战解决高并发(静态资源缓存) - 图1

3. 大图片分段拆分

大图片我们通常会采取压缩,但是压缩后还是很大,而且变得很模糊,不推荐。 我们可以通过PS等图像处理工具将图片拆分成多段,例如淘宝商品的详情页,看起来像一张图,但是实际上是很多张图片通过标签拼接的,此时浏览器可以异步加载图片,提高网页响应速度。

4. 浏览器静态资源版本控制

另外一篇blog专门介绍了:静态资源使用时间戳控制浏览器缓存 浏览器缓存原理:http状态码 304 第一次请求会将内容缓存,第二次请求会响应304表示使用本地缓存。

  1. 更新服务器静态资源文件的修改时间,浏览器发现最后修改时间大于缓存文件的时间,则使用服务器资源。
  2. 静态资源请求url上加时间戳参数

5. 使用Nginx缓存静态页面思想

Nginx实战解决高并发(静态资源缓存) - 图2 需要考虑的问题:

  1. Redis与数据库一致性问题(MQ订阅blog日志实现 同步数据一致性问题)
  2. JVM与Redis缓存一致性问题
  3. Nginx缓存与服务器端真实缓存的一致性问题 (1. 删除Nginx缓存; 2. 商品详情表加版本号字段,详情请求加上版本参数; 3.Lua语言动态渲染模板,控制nginx本地缓存)

实战,使用Nginx缓存商品详情页面?

Nginx核心配置:

  1. ##如果是以all开头只做反向代理不缓存到nginx中
  2. location /all{
  3. proxy_pass http://127.0,0,1:8080;
  4. index index.html index.htm
  5. }
  6. ##如果是以缓存开头的话,缓存到nginx中
  7. location /details{
  8. #使用缓存名称
  9. proxy_cache meitecache
  10. #对以下状态码实现缓存
  11. proxy_cache_valid 200 206 304 301 302 1d
  12. #缓存的key
  13. proxy_cache_key $request_uri
  14. add_header X-Cache-Status upstream cache status
  15. proxy_pass http://127.0.0.1:8080;
  16. index index.html index.htm
  17. }

Nginx缓存与服务器端真实缓存的一致性问题 :

  1. 删除Nginx缓存,不推荐;
  2. 商品详情表加版本号字段,详情请求加上版本参数;
  3. Lua语言动态渲染模板,控制nginx本地缓存