全站 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 模式,进一步保护主机的安全。

从无到有实现 WordPress 全站 CDN

WordPress 的设计有很多莫名其妙的地方,其中之一就是它的域名设置。WordPress 的每一个站点要设置一个独立的主页(Home)地址,而且只能设置一个。也就是说,即使有两个域名指向同一个博客(比如 a.com 和 b.com),如果博客把主页设置成了 a.com,用户在访问 b.com 的时候,也会被重定向到 a.com。这样造成了 b.com 实际上完全无法访问到。

对于使用 WordPress 的博客主而言,通常一个域名就够了,可能最初 WordPress 的开发人员也是这么想的。但现在的互联网,单一域名已经不足以支撑一个网站了。简单来说,WordPress 配置 CDN 相当麻烦。

CDN,又名内容分发网络,一个把网站内容快速传递给用户的工具。它的工作原理是,预先把内容加载(缓存)到离用户较近的数据中心(通常称为 Edge Server),当用户访问网站时,直接从数据中心读取内容,而不是从源网站(Orginal Server),这样就减少了数据传输的时间。如下图:

一个 CDN 包含多个 Edge Server,如果每个用户都访问离自己较近的 Edge Server,则会比直接访问源网站要快很多。而现在的技术又可以做到当用户访问某一个域名的时候,被自动解析到较近的 Edge Server,用户则完全感受不到差别。

现在做得比较好的 CDN 服务如 CloudFlare。它家提供了一条龙服务,从域名解析到内容分发,一个帐号全搞定。这样做的好处是“傻瓜式”,不需要太多的专业知识就可以配置 CDN;而坏处则是一损俱损,CloudFlare 的服务器经常被墙,一旦被墙了,想脱离 CloudFlare 就重新设置一堆东西,很麻烦。

如果你像我一样不喜欢一键搞定的服务,那我们就来一步一步自己配置全站 CDN 吧。

初始化 CDN 服务

首先,你得有一个 CDN 服务,我用的是 KeyCDN,介绍看这里

初始化(KeyCDN 的术语叫“Zone”)完成之后,一般会得到一个二级域名,比如我的是 leonax-1800.kxcdn.com。然后在自己的域名解析中创建一个 CNAME,指向之前的域名,比如我用的是 www.leonax.net。解析刷新之后,初始化就完成了。

修改链接和资源地址

如上文所说,WordPress 限定了网站的地址,比如本博客设置为“leonax.net”,则所有的资源(JS、CSS 等)和链接都会以“//leonax.net/”开头。即使用户访问了主页“www.leonax.net”,其中的各种资源也会从“leonax.net”加载,这样就达不到 CDN 的效果。于是我们要把页面中所有的“leonax.net”全部替换成“www.leonax.net”。下面有一些方法,可选择用其中的一种或多种组合来达到效果:

修改资源地址

WordPress 提供了 style_loader_src 和 script_loader_src 分别来过滤 JS 和 CSS 的地址,我们要做的是把其中的域名删掉,从而使用相对路径。代码如下:

替换正文中的链接

使用 WordPress 的 the_content 过滤器,可以修改正文内容,具体要改什么,视具体情况而定。注意 WordPress 的短代码(shortcode)解析的优先级为 11,所以下面的代码使用了优先级“8”来避免短代码带来的改动。

Apache 输出全文替换

Apache 提供了 mod_substitute 来对输出内容进行修改。如果你的站点中提供了这项功能,则可以轻松改动网页内容:

mod_pagespeed 域名替换

mod_pagespeed 也提供了类似的域名替换功能,比 mod_substitute 智能的是,mod_pagespeed 可以识别出链接字段,比如 <img src=""> 中的内容,而不像 mod_substitute 那样全局替换:

CDN Pull

有些时候,我们可能需要在 CDN 模式下输出 www.leonax.net,而在访问源站的时候则依然得到 leonax.net。这时就需要对 CDN 发来的请求进行定向输出。一般 CDN 方面会给出一些特殊的信息,比如 KeyCDN 会设置一个特殊的 X-Pull 头,标记这个请求是从 KeyCDN 发来的。于是我们可以对这一类请求做特殊处理(Apache):

CORS

Cross-origin resource sharing,跨来源资源共享,是一个浏览器的特性。简单来说,leonax.net 和 www.leonax.net 是两个域,如果 leonax.net 引用了来自 www.leonax.net 的资源,而 www.leonax.net 没有允许这么做的话,浏览器会主动拒绝加载相应资源的。所以,如果两个域都用了 CDN 的资源,则在 www.leonax.net 中,需要允许 CORS。这一项在 KeyCDN 中默认是开启的,我也就没有多关心。

CDN Purge

CDN 的主要原理是缓存,也就是把网页内容缓存在 Edge Server 中,每次响应用户请求的时候,不必再向源站请求数据。这样就产生了缓存过期的问题。比如博客中有人留言,博客页面更新了之后,CDN 却不知道这件事,依然输出不包含留言的页面,这样就不对了。为了解决这个问题,CDN 通常都会提供一种清除缓存的方式,称为 CDN Purge。 KeyCDN 的做法是发出一个如下的 HTTPS 请求,用于清除一个特定页面的缓存:

CDN 方面搞定了,WordPress 依然成问题,因为我们也不知道页面什么时候更新。研究了一下发现,我可以利用 WP Super Cache,在 Super Cache 的缓存页面被删除的同时,也发送一个请求给 KeyCDN,同时删除那边的缓存,一举两得:

上述的代码会在博文更新、或是有新留言的时候触发,会稍微减慢响应速度,更好的办法应该利用 WordPress 的 wp_schedule_single_event 方法,不过暂时还没有研究。

总结

把上述所有内容串起来,就有了现在的全站 CDN

本站开启 CDN 加速

本站的流量以每个月 10GB 的速度上升,而 Google Cloud 对中国地区的流量收费又比较贵($0.23/GB)。这样下去大有流量费用高过主机的势头,没办法,只能上 CDN 了。

之前一直不用 CDN 的主要原因有两个:

  • 一是没有一个 CDN 可以兼顾国际和国内的流量,一般国内的 CDN 都要求域名备案,国外的 CDN 都没有大陆节点;
  • 二是多数 CDN 服务对自定义 SSL 的收费都比较高,比如 CloudFlare 要收取每个月 $200 的费用。

不过最近发现一个 CDN 服务:KeyCDN

KeyCDN 的模式是按用量收费,$0.04/GB,也就是一美元可以有 25GB 的流量,比 Google Cloud 要便宜多了。没有月租,充多少用多少。新用户还有一个月的试用期,送 25GB 流量,非常吸引人。虽然 KeyCDN 也没有大陆的节点,不过在香港和东京都有,勉强可以接受。另外关键的一点是,它家对自定义 SSL 是免费的,直接上传证书即可,5 分钟内自动配置完成,很方便。

为了解决 CDN 服务可能被墙的困扰,本站默认还是从主站加载。然后会自动侦测 CDN 是否可用,如果可用,则会自动切换成从 CDN 加载的模式。对于本站的读者,您将感受不到任何差别,默默地帮我省了流量而已。

使用 QUIC 加速访问 Google

Chrome 从去年开始提出了一项新协议:QUIC,全称为“快速UPC网络连接”(Quick UDP Internet Connections)。 它的目标是使用 UDP 协议来提升网络访问的速度。目前还在积极的开发过程中,不过 Chrome 中已经包含了试用版本。开启的方法如下:

  1. 在 Chrome 地址栏输入并打开:chrome://flags/#enable-quic
  2. 然后把下面两个选项设置成“已开启“(Enabled)
    • 启用 QUIC 协议(Experimental QUIC protocol)
    • 经由实验性 QUIC 协议发出 HTTPS 请求(HTTPS over experimental QUIC protocol)
  3. 重启 Chrome。

目前 Google 的大多数服务都已开启 QUIC 协议的支持,但是由于 QUIC 还在试验阶段,所以第三方网站还没有支持的。

StrongVPN 的详细购买攻略

之前有提到过 StrongVPN一些介绍,不过它家的大多数页面都是英文了,为了方便英文不太好的同学注册,这里把注册流程大致翻译一下:

首页的菜单栏点击“Order”进入注册页面,如下图所示。

  • Choose package:套餐类型,最经济实惠的是 Speical PPTP 1 year,价值55美元,约合人民币340元。
  • Payment method:付款方式,可选的方式有信用卡(Credit Card)、Paypal、Google Wallet 等。如果有国际信用卡的话(就是 Visa/MasterCard 之类),通过信用卡支持是最方便的了。
  • Current Country:所在国家,没什么意外填 China 就好了。
  • Phone number:电话号码。如果有需求的话,客服可以打电话帮你解决。不放心的话可以不填,不是必须的。
  • Comments:备注。没什么特殊需求的话留白就好了。
  • 然后点击SUBMIT进入下一步骤。

在第二步中,如果你之前注册过,请点击 CLICK HERE 登录,这样可以省去重新填写个人信息的麻烦。如果是第一次使用StrongVPN,则需要填写一些个人信息,如下:

  • Email:邮箱地址。用于接收账号开通的信息,以及各种后续的通知。StrongVPN 比较好的一点是,它从不发没有用的广告给你。
  • Password:密码。用于登录 StrongVPN 网站,以便进行后续的设置。密码最短为8位,而必须包含大小写字母和数字,但不能包含特殊字符,如!@#$%^&*()[] 和空格。
  • Password again:再填一次密码以确认。
  • Phone:电话号码,随便填一个就行。
  • First name:名字的拼音
  • Last name:姓氏的拼音
  • Company:公司名称,可不填。
  • Address:地址。由于 StrongVPN 会对注册用户进行审核,所以尽量填得准确一点。比如南京路 123 弄 45 号 67 室的英文是Rm 67, No 45, Lane 123, Nanjing Rd。另外可供参考的有:区(District)、幢(Building)、街(Street)等等。
  • City:所在城市名称的拼音,比如 Shanghai。
  • State USA:除非你在美国,否则不用填。
  • State non USA:所在省份名称的拼音,直辖市不用填。
  • Zip / Postal:邮政编码。
  • Country:国家,选 China 即可。

接下去是付款方式:

  • CC Type:信用卡种类,常见的有 Visa 和 MasterCard,不清楚自己的卡是什么类型的话,可以看看卡的正面,会有 Visa 或者 MasterCard 的字样。
  • CC Number:信用卡号。一种是 16 位数字,不含空格。
  • CC Expire:有效期至,在卡的正面有写。
  • CC CSV:安全码,在卡的反面,签名栏右侧,用空格隔开的最右端的 3 位或 2 位数字。

接下去是一些选填信息,都忽略即可,然后点击蓝色按钮 REGISTER 进入下一步。

然后就是确认页面,这个页面列出了你所选的 VPN 套餐 Package(Speical PPTP),套餐可用时间 Period(1 Year),以及总价 Overall($55.00)。如果套餐选错了,可以点击 Edit Order Data 回去重新选。还有你的个人信息,如果要修改个人信息的话,可以点击 Personal Data 旁边的 edit 进行修改。没有任何问题的话,点击 CONFIRM 就直接下单了。

最后的结束页面一般会显示如下:

这表示 StrongVPN 的工作人员会对这个订单进行审核,审核完毕之就可以使用 VPN 了。一般审核会在 2 小时内完成。如果需要尽早完成审核,可以直接联系客服,具体步骤之后再补。

审核完成之后会收到确认邮件,如下:

然后去 StrongVPN 的首页登录(右上角),用户名是你的邮箱地址,密码在刚才注册的时候填了。

登录后在菜单中选择 VPN Accounts 中的 VPN Account Summary,这个页面列出了你所拥有的 VPN 账号,点击帐号右侧的 Account Setup Instructions,可以找到对应的账号密码,以及在不同的平台上的设置方式。帐号信息大致如下:

Server Address (aka Host Name or Internet Address): vpn-sf55.reliablehosting.com
Login (username/account name): vpn299
Password: xxxxxx
L2TP key (shared secret): yyyyyyyyyy
Server Location: United States, San Francisco
Server IP: 108.171.96.15 (This can also be used in place of Server Address)

然后就可以拿去设置 VPN 啦……

附:在 Windows 7 中添加 VPN 连接

StrongVPN套餐介绍

VPN 是梯子的一种,它提供了网络层的加密通讯,简而言之,一旦连上了 VPN,电脑的所有数据通讯都将被加密

VPN 可以在自己的服务器上架设,需要一些网络知识;也可以购买现有的服务,比如 Strong VPN。VPN 的优势在于,它是一个标准的网络技术,几乎所有的操作系统,包括 Windows、Mac OS、iOS、Android,都支持 VPN 连接,不需要破解或者越狱即可使用,简单方便。而相较于代理服务器来说,VPN 一旦连接上,整个系统都会使用 VPN 连接,而不像代理服务器只能给浏览器提供中转连接,对于那些不支持代理的游戏客户端很实用。

继续 Strong VPN 的话题。Strong VPN 为中国地区的用户提供了一个专门的套餐,大致如下:

  • 价格 55 美元/年(约合 340 元人民币),或者 21 美元/季度。7 天内无条件退款。
  • 提供位于美国、英国、加拿大或者荷兰的高速 VPN 节点。VPN 节点就是 VPN 连接的出口,一旦建立了 VPN 连接,所有的网络通信都将由出口发出。
  • 立即开通,并提供 7*24 不间断的客户服务。
  • 不限流量。

想见识一下墙外的奇妙世界的同学,不妨尝试一下。点这里进入官网,英文不好的同学可以参考这份详细的注册攻略

家用无线网络中的安全设置

无线网络,又称Wi-Fi,是一项日常生活中非常普及的项目,手机、笔记本、甚至电视机都可以连接支持无线网络了。在热闹的地方搜索一下,可以找到十几个可用的无线网络。在普及的同时,设置无线网络的时候,安全问题也越发重要。

先说说会有什么样的安全问题。假设家中的设备都连上同一个无线网络(这是最常见的情况),也就是设备都在同一个子网内,并且都互相信任对方(原因很明显)。这时候如果有个坏人偷偷摸摸连上了这个网络,然后向其它的设备发送一些有欺骗性质的信息,这些信息可以(理论上)用于截获网络通讯(如监听银行帐号和密码)、身份盗用(如查看并偷取重要文件)等……

那么要怎样确保无线网络的安全性呢?

在此之前,先简单介绍一下相关术语:

SSID:Service set identification,也就是一个无线网络的名称,《The Big Bang Theory》中Sheldon一直使用类似“Penny请停止盗用我的WiFi”这样的名称。SSID作为客户端连接无线路由器的代号,在WiFi的有效区域内需要尽量保持唯一,有冲突也行,但这样会降低WiFi连接的效率。

认证方式:常见的有“无(即不管什么设备都能连上路由器)”、WEP、WPA、WPA2,其中WPA2有家用(Personal)和商用(Enterprise)两种。WPA2最为安全,当然也需要消耗很多能量。

加密方式:通常是AES和TKIP,两者没有太大的差别。

MAC地址过滤:经过设置,路由器只允许那些具有特定MAC地址的设备连上路由器。MAC地址是每个网络设备的唯一识别码,在网络通信中的作用相当于身份证。

好啦,说了这么多,现在来看看有哪些方式可以提高安全性:

0、关闭无线网络,这样显然是万无一失了,但同时也失去了无线的灵活性。在此不作讨论。

1、隐藏SSID。多数路由器都支持不对外广播SSID,这样一来,其它设备就无法轻易获得SSID,也就无法连上路由器。这个方法会增加设备搜寻路由器所需的时间,但不会增加路由器本身的负载,是一个性价比很高的方式。但这种方法对于专业人士来说一点安全性也没有……

2、设置WPA2认证,如上所述,这是最安全的方式,但这需要消耗路由器额外的资源,早期部分路由器无法正常支持WPA2,即在大流量的时候会造成路由器死机。现在的路由器基本不会有这个问题。

3、设置MAC地址过滤,只允许家里现有的设置连接。这种方式比WPA2还要安全,只是有客人来的时候,需要重新设置路由器,添加新的MAC地址,比较麻烦。

上述三种方式可以单独使用,也可以混合使用。如果路由器的性能足够好,仅设置2即可;否则,懒的话可以只用1,比如我前段时间就一直在用1,如果想要安全性就只能用3了。