打开速度 Speed UUUUUUUUUUUUUp!

许多研究都表明,用户最满意的打开网页时间,是在2秒以下。用户能够忍受的最长等待时间的中位数,在6~8秒之间。这就是说,8秒是一个临界值,如果你的网站打开速度在8秒以上,那么很可能,大部分访问者最终都会离你而去。

我也不知道哪来的研究结果

如果你觉得现在博客的打开速度比以前快很多的话,那绝对不是错觉。

因为我把整个服务器都 remake 啦!

不知道大家还记不记得,在 HTTPS Available! 里有这么一段话:

2G 内存用现在的眼光看回去已经是超高配了

是的,我的博客打开速度非常慢。

TTFB(Time To First Byte) 时间高达 3 妙

低配服务器导致加载速度拉胯?

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 配置文件夹

可以看到,我的 nginx 配置文件夹并没有 snippets/fastcgi-php.conf ,所以一开始 nginx 提示配置错误的时候我把这行注释掉了。然后我再看了一下该博客之前的 nginx 配置:

有一个 include 命令!

可以看到,前面有一个 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

最后来一个加载速度的测试吧。

现在的加载速度,可喜可贺

作者: 梁小顺

脑子不太好用的普通人。 顺带一提性格也有点古怪。 在老妈子和厌世肥宅中来回切换。

《打开速度 Speed UUUUUUUUUUUUUp!》有一个想法

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据