美国/欧洲/亚洲VPS,网站和博客的速度优化最新建议

王志勇 发表于 2018年11月02日 08:48

2003年时我做的Webshu平台,由于没有赢利点,所以曾推出过“网站提速工程”的创意服务。虽然工作量很大,但还是坚持推出。尽管当时无人问津,业务量为0,但由于长期关注这些技术和测试,给了我不少灵感。

美国、欧洲的主机,价格最便宜,带宽大(100Mbps、1000Mbps共享),但是中美间线路不够理想。国内、香港的主机,价格较高,网络速度一流,但是带宽小(2Mbps~5Mbps独享),贝岸手续繁琐。因此,亚洲最理想的主机只有韩国、日本,网络速度快、带宽大,但是价格高。

几年前中文博客开始掀起了美国主机的热潮,当时超过半数的独立博客都迁到了美国机房。如今的情况相反,超过半数的独立博客搬回了国内、亚洲机房,因为国内、亚洲机房的网页不是秒开,而是极速、瞬间打开,国内、亚洲机房的延迟在20ms~50多ms。

本博客和新博客都使用相同的构架,程序语言+NoSQL,全动态实时生成,非静态缓存。因为生成静态缓存页失去了很多功能,静态缓存的程序设计需要考虑很多因素,动态页一直运转良好,速度接近于静态页,所以一直没有做静态缓存的程序设计。全动态页面速度测试:
http://www.auiou.com (美国VPS,单核CPU,SSD硬盘,网页启用GZIP)
http://blog.emxel.com (美国VPS,单核CPU,可能是HDD硬盘,网页启用GZIP)

美国、欧洲还是有不少好主机,可以这样做优化:

  1. 域名的DNS一定要用国内的。虽然用国外的DNS,速度影响不太大,用国内的DNS会明显感觉首次解析的速度更快。
  2. 首先需要挑选线路。入手之前,分不同时段ping一下测试IP,如果早晨在200ms以内,是比较快的主机。从傍晚到晚上,如果丢包率较高、延迟在300ms以上,说明这个线路不好,需要更换。
    大多数的欧美主机,都是这样的情况,延迟早晨在200ms以内、或220ms以内,傍晚到晚上延迟在230ms~300多ms。只要丢包较少,即使是300多ms,网页还是可以秒开。
    少数优质的CN2线路,现在能做到无论是早晨、晚上都在180ms以内,这是比较理想的欧美主机,速度体验一流,甚至超过一些国内、亚洲主机,因为国内、亚洲主机虽然速度飞快,但是带宽小、有些主机有一定的丢包率。
  3. SSD硬盘。SSD硬盘和HDD硬盘的主机,速度差别还是很明显的,SSD硬盘的寻道时间比HDD硬盘快了几倍。追求速度,一定要用SSD硬盘,因为网站有大量的小软件,如图片文件、CSS、JS等文件,SSD硬盘对大量小文件的读取比HDD硬盘快得多。
  4. 单核、双核CPU的选择。有条件尽量选双核,在1000IP或3000IP以下/天,可能区别不大。但是在高并发的情况下,可能会有较大区别。
    10年前的服务器,全部都是单核,那时候的速度也很快,因此单核的空间,也是有可用之处。
  5. 关闭Apache、Nginx、PHP所有的访问日志、错误日志,因为这些文件很快就会到达几兆、几十兆、上百兆,并定期检查这些文件,用shell命令将它们清空,因为有些日志即使在配置文件里关掉,实际还是无法彻底关掉。例如CentOS的日志文件路径为:
    /var/log/btmp
    /var/log/httpd/access_log
    /var/log/httpd/error_log

    清空的方法,是先用rm -rf命令删除,再用touch命令再建立一个0字节文件,例如:
    rm -rf /var/log/btmp; touch /var/log/btmp;

    上述3个文件用这样的命令一次清空:
    rm -rf /var/log/btmp; touch /var/log/btmp; rm -rf /var/log/httpd/access_log; touch /var/log/httpd/access_log; rm -rf /var/log/httpd/error_log; touch /var/log/httpd/error_log;

网站、博客内部的优化,可以大幅度提高速度:

  1. 对于访问速度较慢的动态页面,需要生成静态缓存页、甚至全站生成静态缓存页。(本文最后继续讨论)
  2. 百度关键词“GZIP 查询”。GZIP能大大提高网页秒开的速度,我发现大部分博客由于Wordpress、Typehco的程序自带GZIP,已经启用了GZIP。但是很多博客使用了静态缓存页,这些静态缓存页,大部分博客已经使用GZIP,但有少数博客的静态缓存页没有使用GZIP。
    PHP动态页可以在网页的最开始写入<?ob_start('ob_gzhandler');?>语句,实现GZIP。如果生成的静态缓存页扩展名是.html,则只能在Apache、或Nginx添加,百度关键词:Apache GZIP 或 Nginx GZIP。
  3. 博客与图片的主机分开,图片使用二级域名。
  4. DIV+CSS。DIV+CSS大概在2006-2007年左右被前端开发者发明出来,实在是一项非常重要的发明,因为DIV+CSS的网页,是边下载HTML边显示,会让人感到网页非常快;在这之前,只能用table,如果整个网页是一个大talbe,需要等整个HTML文件里的table元素全部加载完毕才能显示,比DIV+CSS要慢0.5秒~1秒,差距非常明显。
  5. .js文件的位置,.js文件也可以是.php的动态页,都一起称为.js文件。.js有很多的网站,也包括我很多年以前也是这样做的,在需要显示数据的位置用<script src=****.js></script>引用.js文件,如果这个位置是HTML页里较靠前的位置,则浏览器打开该页面时,必须等此.js文件加载完毕,才能显示后面的内容,这样网页打开时,会有较长时间的空白期,如果这个.js文件是站外的域名,这个空白期可能会在0.5秒~3秒以上。
    解决的办法是:原来的这个位置,设置一个ID,用div或span标签来建立ID,例如<div id=abc></div>。之后,在该HTML页的最后,引用此.js文件,此.js文件写入这样的语句:abc.innerHTML='data 1234'; 这个“data 1234”就是要在该位置显示的内容,这样网页仍然能秒开,而不会出现空白期。

静态缓存程序的编写,或者称为“静态缓存插件”。静态缓存页确实能让网站跑到最极限的快速,但我一直尚未用这个方法。静态缓存页也有几个缺点:

  1. 程序设计有点繁琐。
  2. 由于是纯静态页,所以网站改版的时候,每个静态页都需要再编写程序自动批量修改公共部分。而动态页,网站改版时,只需修改公共的include()文件。
  3. 静态页失去了很多动态页的功能、便利功能。例如现在很多博客使用了静态缓存页,发现留言之后,无法保存Cookies。这是为什么?因为HTML页无法像PHP一样读取Cookies。不过,幸运的是JavaScript提供了读取Cookies的功能,解决的办法是让所有的HTML静态缓存页,同时包含同一个.js的文件,该文件写入document.all.inputnamea.value=(Cookies-a);document.all.inputnameb.value=(Cookies-b);这样的语句,给表单自动填充上Cookies。

最后,如何产生静态缓存、编写静态缓存的插件?从0编写这样的程序,至少需要1-3天的工作量。前几年,我完成过2次这样的程序,第1次用了大概三四天,第2次用了1天左右。原理很简单,调试时就是把整站在本机电脑建立虚拟主机,通过http://访问,写程序时需要实现的功能是用file_get_contents()自动采集、用strpos()和substr()函数分析和遍历该站点下的所有站内链接,并生成HTML文本文件。

对于博客而言,除了上述的这个步骤,还需要再编写额外的php动态插件。这些文件扩展名为.php,被相关页面用include()函数包含。比如用户留言的<post action=>指向的这个文件包含该插件,让用户留言后,该插件实时生成一个新的博文HTML静态页。
发布博客、修改博客同理,让插件实时生成一个新的博文HTML静态页。

这些HTML静态页的扩展名,现在大家的博客在用的静态缓存插件,可能都是.html。其实我更建议生成的扩展名可以是.php,或者用.htaccess文件指向一个php文件(Nginx不支持.htaccess,只能修改default或default.conf文件来实现),来包含这些静态缓存,这种方式是半静态、半动态(其实90%以上的都是静态),可以实现部分动态功能。这样对速度不会有影响,因为我使用全动态都没有影响,更何况90%以上的静态页。

4条评论:
1   笛声 2018-11-02 21:52
>/var/log/btmp
直接这样就能把btmp文件清空

自由勇 2018-11-03 09:14
谢谢!等下次我的VPS重装系统时测试一下。
因为之前用touch无法直接重写该文件,可能因为默认的权限不是777,后来用rm -rf解决了。

自由勇 2018-11-08 13:59
昨天新装系统,测试了一下,>/var/log/btmp 管用。谢谢!
默认的文件权限是640,/var/log是775,/var/log/apache2是750,在不修改权限的情况下,这个语句能起作用。

2   龙笑天 2018-11-02 22:28
提速太困难了 感觉还是升级服务器配置最直接~

自由勇 2018-11-03 09:15
是的,优化很消耗时间。如果预算的条件允许,升级服务器也很好。:)

3   自由勇 2018-11-04 10:13
更新:
网站、博客内部的优化,可以大幅度提高速度:
4. DIV+CSS。DIV+CSS大概在2006-2007年左右被前端开发者发明出来,实在是一项非常重要的发明,因为DIV+CSS的网页,是边下载HTML边显示,会让人感到网页非常快;在这之前,只能用table,如果整个网页是一个大talbe,需要等整个HTML文件里的table元素全部加载完毕才能显示,比DIV+CSS要慢0.5秒~1秒,差距非常明显。

5. .js文件的位置,.js文件也可以是.php的动态页,都一起称为.js文件。.js有很多的网站,也包括我很多年以前也是这样做的,在需要显示数据的位置用<script src=****.js></script>引用.js文件,如果这个位置是HTML页里较靠前的位置,则浏览器打开该页面时,必须等此.js文件加载完毕,才能显示后面的内容,这样网页打开时,会有较长时间的空白期,如果这个.js文件是站外的域名,这个空白期可能会在0.5秒~3秒以上。
解决的办法是:原来的这个位置,设置一个ID,用div或span标签来建立ID,例如<div id=abc></div>。之后,在该HTML页的最后,引用此.js文件,此.js文件写入这样的语句:abc.innerHTML='data 1234'; 这个“data 1234”就是要在该位置显示的内容,这样网页仍然能秒开,而不会出现空白期。

4   自由勇 2018-11-04 11:56
Trackback来自《VPS的快速安装和PHP调试导航页

虽然这些文章正在增多,但实际上,VPS的安装、配置比我们想象中容易得多,新机通常在半小时内能完成整个安装、配置。

发表评论:
名字: (*必填)
博客: (可省)

正文:

  记住信息?

王志勇:1980-09-26 (44周岁)
程序设计,前端设计。

版权声明:本博客所有文章,均符合原创的定义,禁止转载,违者将必究;正确的方法是贴原文的标题和网址即可。

与此相关的链接
自由勇专栏

Blog存档 Archives

2022年07月
2022年06月(15)
2022年05月(20)
2022年04月(16)
2022年03月(9)
2022年02月(9)
2022年01月(10)
2021年 +

2020年 +
2019年 +
2018年 +
2016年-2017年(9)
2014年06月-09月(10)
2013年 +
2012年 +
2011年 +
2010年 +
2009年 +
2008年 +
2007年 +
2006年 +
2005年09月(4)

Copyright © 2006-2024 auiou.com All rights reserved.
此Blog程序由王志勇编写