从最开始的首页首次 30-40s 才能加载完成,到现在最多只需要 3s,速度提高了很多大家可以体验下
图裂了 同时也没找回来。七牛云 呵呵~
原因
这个问题我在第一次使用就注意到了,第一次加载首页特别慢卡,issues中也有人说了造成原因
https://github.com/ZHENFENG13/My-Blog/issues/36
https://github.com/ZHENFENG13/My-Blog/issues/16
虽然存在,但我一直没关心,直到今天tomcat挂了,没找到原因,根据日志
2018-07-31 14:10:51.517 [http-bio-80-exec-3] ERROR org.springframework.boot.web.support.ErrorPageFilter - Cannot forward to error page for request [/user/img/rand/3.jpg] as the response has already been committed. As a result, the response may have the wrong status code. If your application is running on WebSphere Application Server you may be able to resolve this problem by setting com.ibm.ws.webcontainer.invokeFlushAfterService to false
org.apache.catalina.connector.ClientAbortException: java.net.SocketException: Broken pipe (Write failed)
Broken pipe
这个错误如果看平时项目会发现比较常见,一般项目中都会碰到,但是就算报如上错误,项目其实还是能正常运行。同时这个错误也很容易重现。
打开网站,然后迅速叉掉退出该网站,后台日志就会报如上错误,可以自行测试
所以这里就会有问题了,一般网站3-4秒最多就能刷出来,而我的网站第一次进入可能需要 30-40s,才能请求完成。
虽然不知道具体是什么原因造成,但是图片绝对有问题。
解决
首先这里图片的获取机制我猜测应该是先通过项目本地获取,然后以 seesion+cookie 的形式保存在 tomcat 内存中
1、七牛云
很多人说采用七牛云存储,对这里网站的提速是一些帮助,但是缘由并不是我们想象的。因为要明白,虽然七牛云采用了CDN存储,但是对这里并不会有效果,反而我们将图片存在项目本地,从本地拿图片和通过外链获取相比较,绝对是本地更快。(采用了七牛云的图片处理服务除外)。但是这里采用使用七牛云还是有如下几个好处:
- 减轻我们自己服务器读取数据压力
- 减少部署项目包的大小体积
- 缓存从七牛云存储上获取,并不通过 jssiononid 从 tomcat 内存中获取(这里可以提速很多)
最重要的就是第三点,Spring boot+jssionid+Centos
是否真的生成jssionid
慢,但是如果我们使用七牛云图片不再本地后,不用我们本地做缓存,所以压根不用生成。而且七牛云的服务器总比我这小菜服务器配置好,所以妥妥的
这里提一句。一个稳定的图床是我们开发必备的工具,我选择的是七牛云,虽然七牛云相比其他监管严格,需要上传身份证。但是这也意味着更稳定,毕竟大家都懂得。所以我还是建议大家尽早把七牛云图床开通好,就算不为了其他的,写博客我们不可能真将图片上传到服务器吧,而且七牛云免费的够我们使用了。
这里如果采用的其他图床也是一样的,修改下获取图片的方式即可,见如下代码
/**
* 显示文章缩略图,顺序为:文章第一张图 -> 随机获取
*
* @return
*/
public static String show_thumb(ContentVo contents) {
int cid = contents.getCid();
int size = cid % 20;
size = size == 0 ? 1 : size;
return "http://images.bixiaode.com/" + size + ".jpg";
}
将上面地址,改成我们图床的外链地址。
如果大家当前没图床,上面这一步可以直接跳过,将图片先放到本地再说。
2、压缩
其实我们如果了解下:网站加载图片速度慢如何优化?
图片优化,无非压缩、合并、CDN、缓存、延时加载、独立域名
说的最多的也是最容易实现的就是压缩图片。我的图片太大了,我最大的一张图片有 9M。。。。
所以我将图片压缩下,我不会 PS,这里选择非常出名的图片压缩网站https://tinypng.com/
然后将压缩后的图片重新放到本地或者七牛云上,将缓存清掉,然后重启tomcat,测试下。
虽然还是有点慢,但是好了很多,只要5-6秒多,相比以前的 30-40秒快了很多。
其中一张特别慢,卡住所有请求时间了,图片大小 1.5M,只能再次压缩,完后后请求只需要 2-3 秒了。
这里我看到 issues 中有人提到了一句
我在macos windows ubuntu上部署都没问题,唯独centos特别慢。后来查阅网上博客得知是springboot内置的tomcat在处理第一个用户请求的时候,卡在生成sessionid那一步了。生成sessionid用到了java随机数。centos下的默认配置略有问题,解决方法之一是修改$JAVA_HOME/jre/lib/security/java.security文件中securerandom.source的值,从默认的file:/dev/random改为file:/dev/urandom。修改后第一次访问也基本能做到2秒内响应。
我不知道是这位老哥一个人是这种情况还是大家都是这样,但是我不是,可能是我图片放到七牛云的原因。
因为很明显可以测出来,当我们本地跑项目时其实就相当于将项目部署到 windows 系统下,然后我的服务器是 Centos 系统。我发现本地和服务器差不多都需要 5-6 秒,所以这里修改与否对我没啥帮助,大家可以测试一二,如果真的在本地跑非常快,服务器上慢很多,可能是服务器配置问题也有可能是这个原因。
本文由老郭种树原创,转载请注明:https://guozh.net/youhuatalebokeshouyejiazaiman/