做网站的过程里迟早会有人跟你说「挂到 Cloudflare 上」。你照做了,域名的 DNS 换了地方,网站还是那个网站,看不出区别,也不知道自己开了什么。
它做的事其实可以分成三块,分开看就清楚了。
一、它站在你和访客中间
正常情况下,访客输入你的域名,DNS 告诉他你的服务器在哪,他直接连过去。
用了 Cloudflare 之后,DNS 给出的是 Cloudflare 的地址。访客连到离他最近的 Cloudflare 节点,由这个节点去找你的服务器要内容,再转给访客。
你的服务器地址因此不再对外暴露。这是它最基础的一层价值:别人打不到你的服务器,就很难直接攻击它。
代价是你的服务器看到的所有请求都来自 Cloudflare。如果你的程序要记录访客真实 IP,得从请求头里取,不能用连接来源。这是接上之后最常见的一个坑,表现为「所有访客的 IP 都一样」。
二、它把内容存一份在离访客近的地方
这是多数人以为的全部,也确实是最有价值的部分。
Cloudflare 在全球有几百个节点,离新西兰最近的在奥克兰。你的服务器可能在悉尼、新加坡或者美国。第一个访客来的时候节点没有内容,去你服务器取一份存下来;之后的访客直接从奥克兰拿。
省下的是一整趟物理往返。奥克兰到悉尼一个来回大约 110 毫秒,这段距离在光速下就是这么久,任何优化都改不了。命中缓存的请求不需要走这一趟。
但有两件事需要讲清楚,否则你会对它期待过高:
默认它只缓存图片、样式、脚本这类静态文件,不缓存页面本身。因为它不知道你的页面是不是每个人看到的都一样。如果你的网站是 WordPress 这类每次现拼页面的系统,那么访客每次打开首页,Cloudflare 还是要回你的服务器要一次。要让它缓存页面,得自己配规则。
缓存时间是上限,不是保证。节点存储是所有网站共用的,按访问热度淘汰。流量小的网站,即使设成一年,几小时没人访问那份副本也会被挤掉。这解释了为什么你的网站有时秒开有时要等——详细的我们单独写过一篇。
三、它挡掉一部分坏流量
互联网上大量请求不是人发的:扫描漏洞的、试密码的、抓内容的、发垃圾评论的。小网站也一样会被扫,因为扫描是自动的,不挑对象。
Cloudflare 免费版会挡掉其中相当一部分,这部分省下来的服务器资源是实打实的。
但它挡不住的东西也要知道:应用层面的漏洞它管不了。程序本身有问题、密码太弱、插件老旧不更新,这些 Cloudflare 一个都解决不了。它是门口的保安,不是屋里的锁。
免费版够不够用
对绝大多数企业网站,够。
免费版包含:全球节点分发、免费 SSL 证书、基础的攻击防护、无限带宽。最后一条对图片多的网站尤其实在——流量费在别处是要另算的。
付费版主要买的是更细的规则控制、更详细的日志、更多的分析数据,以及一些针对性的加速功能。这些在你的网站还没有稳定流量之前,基本用不上。
接上之后最容易出事的四个地方
SSL 模式选错。它有几种模式,决定 Cloudflare 到你服务器这一段用不用加密。选成 Flexible 的话,访客到 Cloudflare 是加密的,Cloudflare 到你服务器是明文的,而浏览器显示的是安全的小锁。这是一种虚假的安全感。只要你的服务器有证书,就应该选 Full (strict)。
缓存了不该缓存的东西。如果你配了页面缓存规则却没排除后台路径,会出现两个症状:登录后台看到的是别人的缓存页面,或者你改了内容线上不变。后台、登录页、接口路径都必须排除,带登录 cookie 的请求也要排除。
它会缓存 404。一个图片还没传上去,有人访问了一次,Cloudflare 记住了「这里是 404」。之后你把图片传上去了,访客看到的还是 404,直到缓存过期。这个坑我们踩过两次,两次都花了时间才想到。排查方法是在地址后面加一个随机参数——如果加了参数就正常,那就是缓存问题,不是文件问题。
改了文件但线上是旧的。样式和脚本被缓存之后,你改了服务器上的文件,Cloudflare 还在发旧版本。解决办法是给文件加版本号——地址变了就是新文件,缓存自然失效。不要靠手动清缓存过日子,那是靠人记得,迟早会忘。
一个简单的自查
访问你的网站,打开开发者工具的网络面板,看响应头里有没有 cf-cache-status。
HIT 表示这次是从节点直接给的。MISS 表示这次回了你的服务器。DYNAMIC 表示 Cloudflare 认为这个内容不该缓存,每次都回源。
如果你的页面一直是 DYNAMIC,说明缓存这块你其实没用上,只用到了防护和 SSL。这不算错,但你可能以为自己已经很快了。
我们交付的站点默认配好这些,包括缓存规则、版本号策略和排除路径。这些配置本身没有秘密,上面写的就是全部要点,区别只在于有没有人真的一项项去设、去验证。