许多研究都表明,用户最满意的打开网页时间,是在2秒以下。用户能够忍受的最长等待时间的中位数,在6~8秒之间。这就是说,8秒是一个临界值,如果你的网站打开速度在8秒以上,那么很可能,大部分访问者最终都会离你而去。
我也不知道哪来的研究结果
如果你觉得现在博客的打开速度比以前快很多的话,那绝对不是错觉。
因为我把整个服务器都 remake 啦!
不知道大家还记不记得,在 HTTPS Available! 里有这么一段话:
是的,我的博客打开速度非常慢。
低配服务器导致加载速度拉胯?
https://www.wanghuiblog.com/post/what-is-ttfb/
TTFB 是 Time To First Byte 的缩写,是指从访客打开网站页面到网页内容开始呈现之间的等待时间。
按照大的方面来讲,这个指标受两个因素影响:服务器的性能和网络带宽。
一开始我以为是网络的问题,结果在我备份服务器文件的过程中,发现单文件传输速度最高可以达到 3MB/s,我就觉得应该不是网速问题。
那么只可能是配置问题了,目前我所使用的阿里贫民机配置是单核 CPU + 512M 的内存(连我之前用的贫民学生机都有 2G!),之前也有很多次因为内存不足导致数据库无法申请到足够的 buffer 然后挂掉的事情发生,我就一直留下了「网站加载这么慢是服务器配置不好」的印象。
直到前天,小斌(@shellbin)和我说,他有一台闲置的低配阿里云主机,如果我觉得博客卡的话可以迁移到他的主机上,这样应该就不会那么卡。我想了一下,既然可以白嫖,那何乐而不为呢!
然后我问了一下小斌的阿里云主机配置是多少,小斌答曰:「单核 512M」
那和我的配置不是一模一样的吗!
所以我就跟小斌说,还是算了,配置都一样,就算部署起来也肯定是卡的。
小斌不信邪,自己搭了一个 wordpress 页面测试,结果我进去时的 TTFB 才 300ms 左右,是我页面的十二分之一。
我不信邪,觉得应该是数据量的缘故。于是我把自己的 wordpress 配置导了出来,让小斌导入到他的测试页面中,然后再进行测试。
结果还是 300ms。
奇了怪了,为什么同样的配置,小斌的机器打开速度那么快,而我的就那么慢呢?
于是我开始了分析。
差别是什么?
经过一番搜索,发现有以下这几个区别:
1. 小斌用的 php 是 8.1 版本,我的是 7.6
根据小斌的介绍,php8 采用了 JIT (just-in-time compilation),听说好像是从脚本解释执行转为了二进制代码执行,加快了执行效率。
(2024.8.13 补充:
JIT 的意思是,在解释执行的过程中识别出可以优化的部分,然后直接把这部分转为机器码执行,从而提高执行速度和效率)
2. 我的操作系统是 Old School 风格的 CentOS,小斌的是 Debain
看介绍说好像 Debain 的性能会稍微好一点,也不知道是真是假。
3. 我的数据库是 mysql,小斌的是 mariadb
我的数据库经常会因为内存不足而挂掉 / 重启,而听小斌说他就从来没有遇到过这种问题,所以我觉得数据库可能也是其中的一个影响内容。
控制变量实验?
本来我想保留其他的区别,然后一个一个换掉看看到底是什么导致了性能瓶颈。但是在替换 mariadb 的时候我发现:mysql 和 mariadb 要共存是很麻烦的,去掉 mysql 再装 mariadb 也很麻烦,更别说是在 CentOS 这种 old school 的操作系统上了。
所以我直接放弃了控制变量实验的想法,直接进行一个重装系统环境的大换血(
服务器 Remake 过程
安装 Debain
这个没啥好说的,阿里云主机上更换操作系统非常方便,先关机再点几个按钮就好了。
安装 nginx、php 和 mariadb
https://blog.shellbin.me/?p=1851
伟大的小斌已经把很多坑都给踩过了,所以安装环境的过程在上面的博文里基本上都有,复制命令行然后跑下来就好了。
配置
配置的部分参考 HTTPS Available! 和 本站复活了! 就好,反正都是同一个站点,基本没啥差别。
踩坑记录
Nginx 配好了,配置没有错误,但是主页只返回一个空白页面
- 打开控制台,发现服务端返回的是 200,证明 nginx 没有挂掉,正在正常工作。
- 尝试访问文件夹里面的静态 html 页面,发现可以正常访问
根据上面两点,可以得出一个结论:php 出了问题。
至于是哪里除了问题呢?
忘记说了,我备份的时候啥都备份了,就差 nginx 的配置没有备份,所以我的配置是直接照抄小斌的,后来我发现问题在这里:
可以看到,我的 nginx 配置文件夹并没有 snippets/fastcgi-php.conf
,所以一开始 nginx 提示配置错误的时候我把这行注释掉了。然后我再看了一下该博客之前的 nginx 配置:
可以看到,前面有一个 include fastcgi_params
。这个 fastcgi_params 是啥呢……?
看上去,像是 nginx 转发给 fastcgi 的一系列参数,从这个没有加上就只能获得全空白的页面情况来看,这些参数是必不可少的。
加上 include fastcgi_params
之后,就可以正常打开页面了。
而且也可以看出来这个 include 的根文件夹是 /etc/nginx/
可以通过 ip 访问页面,通过域名则不可以
原因:不知道为什么,在 chrome 里,即使我已经表明了是 http 协议,它还是会自动转到 https,如果还没有配置好证书和对应的 https 端口(443)监听的话,浏览器自然不会获得回应,所以就没有办法访问页面。
(顺带一提,好像现在页面链接已经默认全都是 https 的了,蛋疼)
总结
我做了的所有处理
- 操作系统:CentOS7 → Debain 11.2
- 数据库:mysql → mariadb
- php:7.6 → 8.1
- DNS 解析:CloudFlare → 阿里云(被阿里云打电话查水表问域名是不是解析到非阿里云主机了)
- 字体 CSS CDN:GoogleFonts → 阿里 CDN
最后来一个加载速度的测试吧。
传教成功