启用 CloudFlare 作为主 DNS 服务器

之前写过一系列文章介绍自己搭建 DNS 服务器的方法,我自己也这么用了一段时间。效果很好,DNS 解析一直都没出什么问题。但是这个自建的 DNS 服务器却成了最容易受攻击的一环。

博客的 HTTP 服务器躲在了 Google 的负载均衡服务后面,几乎不会被攻击。而 DNS 服务器却没有这一层保护。不知道为何,对于 53 端口的负载平均我一直都没有成功配置出来。于是就一直在使用裸机作为 DNS 服务器。所幸的是,一直以来也没有受到过攻击。

实际上我一直在等 Google 的 Cloud DNS 提供自定义域名的功能,但是这个新功能死活不开放给公众使用。我也没什么办法,纠结了一会之后,就转投 CloudFlare 了。

虽然 CloudFlare 是一个 CDN 提供商,但它也可以配置成只做 DNS 解析,而不用于 CDN 的方式。CloudFlare 提供的 DNS 服务器使用了 AnyCast 技术,看上去没有被墙,可以正常解析。并且它家也提供了 DNSSEC 机制,可以从一定程度上降低 DNS 劫持的风险。

从今天起新的 DNS 设置已完全生效,本博客可以全面抵挡任何类型的攻击。要练手的同学可以试一下。

站点启用 Certificate Transparency

之前一直都以为 Certificate Transparency 这个东东是给 EV 用的,没想到今天看了篇文章,说是个人站点也可以用。于是就去申请了一下。

先简单说说 SSL 证书的安全性。SSL 的机制是一个简单的信任链关系,浏览器并不能区分两个受信任的 CA 对同一域名签发的证书。比如本站的证书是由 DigiCert 签发的,如果另一个 CA 有意或无意也签发了一个对于 leonax.net 的证书,浏览器在访问网站的时候并不知道哪个证书是“真的”,哪个是“假的”。于是如果有两个网站,使用了不同 CA 签发的证书,且都说自己是 leonax.net,那么浏览器都会显示出“安全”的图标。现在 SSL 证书泛滥,部分 CA 为了降低证书申请的门槛,并没有做到严格的域名审核步骤,导致一些恶意分子有机可趁,伪造证书来骗取用户的信任。

简单来说 Certificate Transparency 是一个用于增强 SSL 证书安全性的东西,它可以确保 CA (Certification Authority) 不乱发证书。CT 的做法是通过一个第三方的验证机制,来判断证书的改动有没有出现异常。比如上述情况,会有两个 CA 同时向验证服务器提交信息,或是一个提交了,浏览器却收到了另一个的证书,这样便可以区分出“真假证书”了。

本站的证书是在 DigiCert 申请的。DigiCert 对 Certificate Transparency 的介绍可以看这里。实际上它废话了一堆,只是告诉你要去联系客服开启 CT 即可。于是我就去找了客服,十分钟搞定,当中还绕来绕去说了一些废话,可能是因为美国当地时间是夜里,客服不太清醒的缘故。不过事情也不复杂,很快客服就给我重新签发了证书。拿到新的证书之后,再上传到网站服务器即可。

开启了 CT 之后,在 Chrome 的网站信息中就可以看到类似上图的字样。说是网站已提供有效的 Certificate Transparency 数据。

博客 2015 年度访问数据统计

这大概是我第一次发布如此的统计,细心的读者大概可以发现本博客最早的文章发表于 2004 年,只是好多年来,访问量实在不值一提。直到去年,博客的访问量终于有实质的上升了。

2015 年全年博客的页面点击量(Pageview)为 2,217,504,比 2014 年上升了 42%。总访问人次为 804,116,比 2014 年上升 47%。也就是说,差不多平均一个人浏览 2、3 个页面就离开了。这符合博客的特性,毕竟我的博文都是全文输出,文章内容不分页,也没有其它骗点击的小把戏。大家看完一篇文章后,再回首页看看,然后就结束访问了。

看了坛子的文章,发现月光博客在 2015 年的文章访问量只有 75 万多一点。这么说来,我的博客还比月光博客热门那么一点。是不是该高兴一下下?

在 200 多万的页面访问中,有超过 80% 的用户来自中国(包括台湾和香港),剩下最多的是来自美国的访客(5%)。看来有能力出国的同学们,所阅读的技术文章都已转向了英文,我的博客自然对他们没什么吸引力了。

访客所使用的浏览器前三名分别 IE(52%)、Chrome(25%)、Safari(7%)。除了 Safari 比起 2014 来上升了 2% 之外,前两位的比例没有明显的变化,IE 依然是大众的主流浏览器。操作系统方面,Windows(76%)、Android(8.96%)和 iOS(8.75%)占据前三位,Mac OS X 只占了 3%,Windows Phone 更是只有可怜的 0.06%。在移动时代全面到来的时候,Windows 家族大势已去了。

博客的页面平均加载时间从 2014 年的 3.01 秒下降到了 1.90 秒,速度提升 37%。这和我在 2014 年底把博客迁移至 Google Cloud 密不可分。Google Cloud 的总体表现令人满意,希望在 2016 年全面使用 Google CDN 之后,页面的加载时间可以降到 1 秒以下。

新的一年,我会致力于改进用户体验,随着访客上网设备的改变,访客所浏览到的内容形式也在慢慢地变化。博客不能一直受限于文字模式,提供用户喜闻乐见的内容,才是博客存在的意义。

上线了三台 CDN 服务器

我对 KeyCDN 的服务感到非常失望,它家的缓存算法和缓存服务器速度都存在相当多的问题,导致本博客基本上每次访问都会回源,反而增加了加载时间。为了提高全球访客的浏览体验,本博客新增了三台 CDN 服务器,分别位于比利时、美国爱荷华州和中国台湾。

CDN 服务器会缓存所有的博客页面,直到页面有更新,比如新增博文或评论,才会刷新。这样做相当于做了全站静态化,并把静态页面事先加载到三个主要的大洲。世界各地的来访请求,会被 Google Cloud 的负载平衡引擎导向最近的静态页面,使得加载时间降到最低。距离 CDN 服务器较近的用户,可以获得小于 100ms 的页面下载时间。

目前由于价格的原因,图片资源依然放在 KeyCDN。Google Cloud 的 CDN 项目正在内测中,明年年初公测之后,如果价格合适,就会全部转向 Google Cloud。

有兴趣的同学们,欢迎测速 :)

CDN 似乎工作不正常

由于大家都懂的原因,这几天发生了不少事情,本站所使用的 CDN 也受到了一定程度的影响。这几天已有至少两位用户表示图片打不开或加载缓慢。

对于这种情况,暂时的解决方案是:

  1. 在你的浏览器中清空本站的 Cookie,这样可以触发 CDN 探测,如果 CDN 访问不了,则会切回源站;
  2. 升级你的浏览器至最新版本,如 Chrome 45、IE 11 / Edge、Firefox 40 等。

另外我还在考察国内的 CDN 服务,如果有合适的,过段时间会切换到国内 CDN。

全站 CDN 开放测试

几个星期之前本站开始使用了 KeyCDN 作为内容分发和加速,和其它多数 CDN 一样,KeyCDN 也是可以被用于全站 CDN 的。只不过由于 WordPress 自身的一些缺陷,使得全站 CDN 配置起来非常麻烦。

全站 CDN 的好处不言而喻,就是速度快。本站的主机在台湾,亚洲的读者可能没什么大问题,但从欧洲访问过去,最快也至少要 500ms 才能得到内容(第一字节时间,TTFB)。而使用了 CDN 之后,TTFB 会下降到 50ms 以下,必要的 CSS 文件在 500ms 内下载完毕,达到了真正的秒开。

于此同时,之前的一些问题,比如留言之后 CDN 刷新不及时,都已经修复。目前已经没有已知的阻碍正常阅读的使用问题了。想体验一下的同学,可以在左上角目录中选择“使用 CDN”。如果你没有看到这个链接,则说明要么你已经在使用 CDN 了;要么,本站的 CDN 已被墙。

节点分布图可以看出,离大陆最近的节点在香港,除了主机所在地台湾之外,各大主要网络区域都有节点覆盖。也就是说,除了来自台湾的读者可能感受不到 CDN 的优势之外,世界上大多数地区的读者的访问速度都会有提升。

由于 KeyCDN 并不是针对全站 CDN 来设计,它使用起来或多或少还是有些不方便,没有 CloudFlare 那样的完美。但作为一个每月只需要不到一美元的服务,KeyCDN 真是物超所值。继续测试一段时间之后,如果没有太大的问题,站点将全面切换至 CDN 模式,进一步保护主机的安全。

使用 Noto Sans CJK 做为博客的默认字体

Noto Sans CJK 是 Google 和 Adobe 在去年发布的一系列新字体,它包含了中日韩三种文字的字体,CJK 为中文(Chinese)、日文(Japanese)和韩文(Korean)的缩写。在 Google 的定义中,它属于 Noto Sans 系列,而 Adobe 则把它包含进了自家的 Source Sans 家族,实际上是一回事。

在英文网页中,切换字体,哪怕是一种没有广泛流传的新字体,也非常简单。因为英文只有 26 个字母,一个字体文件充其量不过上百 KB。而汉字则不一样,常用字就至少有 2000 个,全集大概超过 8 万,Noto Sans 中光简体中文的字库就高达 18MB。想在网页中使用一种新的中文字体并不容易,总不能让用户访问一个网页,就消耗 18MB 的流量吧。

于是,在网页中加载中文字体,还要使用特殊的方法。简单来说,就是事先统计出需要显示哪些文字,再动态地在原字库中删除那些不必要的,只下载必要的字形数据。一篇博文中不同的汉字数量大概 1000 个不到,这样可以有效地减少下载量,也提高了加载速度。

我到处看了一圈,现在比较成熟的工具是 Adobe 提供的 TypeKit。在 TypeKit 中可以动态创建一个 JS 文件,这个 JS 文件加载之后,会动态扫描网页的内容,并从服务器端按需加载字体数据。一个网页大约需要下载 300K 左右的数据,这比 18MB 要好多了。如果你想体验一下 TypeKit 的效果,在可以左上角目录中选择“Noto Sans”,等几秒钟之后,就可以看到效果了。 TypeKit 的用法还在进一步调整中,所以没有默认就加载。

当然,一劳永逸的方式还是直接把字体文件安装了:

  • Windows、Mac OS: 安装说明看这里,GitHub 的下载分流地址
  • Ubuntu: sudo apt-get install noto-sans
  • Chrome OS:版本 38 已自带
  • iOS:貌似没有不越狱直接安装的方法
  • Android:5.0 自带,4.x 之前原生 ROM 没有提供替换字体的功能,第三方 ROM 可能有