Saber 酱的抱枕

Fly me to the moon

09/5
2024
软件

也是用上 Cloudflare 了

久闻 Cloudflare 大名,今日一试,果然是大善人,免费的就很好用,CDN 加速神中神,15 年证书也非常省心!
反观国内云主机厂商,阿里云现在一个账号每年只有 20 个免费的 SSL 证书额度。而且去年免费证书的有效期还是一年,今年就给缩短到 3 个月了,而之前的一年有效期的改为单域名 68 元/年,哈哈,生财有道啊。

我现在只用到了 CDN 和证书,记录下流程。

添加域名

注册或登录 Cloudflare 账号,进入控制台,添加你的域名,如 saber.love。费用计划选择免费的就行。

配置 DNS 解析

如果你的域名不是在 Cloudflare 注册的,那么还需要修改名称服务器(Name Server),这样才能让 Cloudflare 管理这个域名的 DNS 解析。

点击控制台左侧的的“DNS”菜单就可以看到 Cloudflare 的名称服务器。

然后在域名注册商的控制台修改这个域名的 Name Server,设置为 Cloudflare 的这两个 Name Server。

等到 Cloudflare 检查到修改生效后,会给你发送一封电子邮件进行提醒:

并且此时在控制台的“概览”里,也会显示“Cloudflare 正在保护您的站点”:

注意:Cloudflare 默认只会添加这个域名的主域名解析,如果有子域名,需要在 Cloudflare 里手动添加 DNS 记录。

作用

如果这个域名之前用的是普通的 DNS 解析,那么访问过程是这样的:

浏览器 ---- DNS 记录(直接就是服务器真实 IP)

而 Cloudflare 解析生效后是这样的:

浏览器 ---- DNS 记录(Cloudflare 的 IP) ---- 服务器真实 IP

让 Cloudflare 进行 DNS 解析的作用有:

  1. 隐藏源站 IP
  2. 抵挡 DDOS 攻击
  3. 为静态文件做 CDN

这些功能都是免费的。

DNS 缓存更新后才会生效

虽然 Cloudflare 检测到了 Name Server 的变化,但这个域名的 DNS 解析的缓存还需要一段时间才能更新,这不是 Cloudflare 能控制的。我觉得 4 个小时就差不多够了。

如果用户访问这个域名时,他的 DNS 缓存尚未更新,那么他访问这个域名时还是跟之前一样,并没有经过 Cloudflare 处理。

如何验证 Cloudflare 的 DNS 已生效

方法 1:可以 ping 一下域名,如果 IP 地址不再是服务器的真实 IP,就说明你的 DNS 缓存已更新,现在的 IP 是 Cloudflare 的 IP。

方法 2:查看请求的 Response header,如果有 Cloudflare 的一些标记,说明已经被 Cloudflare 处理了。例如:

不过这只能代表你自己,可能有些地区的 DNS 缓存此时还没有更新。

CDN 加速效果

本站服务器位于美国,所以在东亚地区访问时的延迟比较高,等待时间也长。

Cloudflare 的 CDN 加速效果我是挺期待的,不过用了之后还是感觉太震撼了,网页资源全部加载完只花了 1.1 秒(图中的静态文件已经全部被 CDN 缓存了):

我在两个月前已经对网页代码进行过很多优化了,但是完全加载时间经常也得 2.5 秒,有时候网络慢的话需要接 3 秒。现在 CDN 消除了网络的短板,把时间直接缩短到 1 秒级别了。

这些走 CDN 的文件,等待时间少的恐怖:

现在我在同一个网页里测试,对比两个月前后的情况:

以前所有文件的加载时间基本都要 500 毫秒以上,稍微大点的图片(超过 200 KB)超过 1 秒也很常见。现在但凡有 CDN 缓存的,都不会超过 200 毫秒。

对于两个背景图片,一个还没被缓存,一个已经被缓存了,这是它们加载时间的差别:

现在本站背景图片的加载速度也有了质的飞跃,爽!


不过现在有个问题,就是网页源码本身加载时间还是很长,经常要 800 毫秒以上。这是因为本站网页都是动态生成的,不能被缓存。

我试了试把首页的代码保存成一个静态的 html 文件,比较有趣,当它被缓存后,我按 F5 刷新(允许缓存),它只需要 300 毫秒。但如果我不带缓存刷新的话就还是要 800 毫秒。

我使用隐身模式模拟首次访问这个静态文件,它也还是要 800 毫秒。所以 Cloudflare 的 CDN 缓存对网页文档本身作用不大吗?至少在首次访问时,网页本身还是源站的加载速度。但是其他静态文件都受到了 CDN 加速:

配置 TLS 加密模式

默认的 TLS 加密模式是“灵活”。如果 DNS 已经由 Cloudflare 处理,那么你应该根据情况设置:

  1. 如果源网站之前没有使用 TLS(也就是只支持 HTTP,不支持 HTTPS),那就保持“灵活”。
  2. 如果源网站之前已经有 TLS 证书(支持 HTTPS),应该选择“完全”(不管你是否要使用 15 年的证书)。
  3. 如果你要把网站的证书换成 15 年的证书,应该在替换后选择“完全(严格)”。

给网站使用 15 年有效期的证书

Cloudflare 可以提供 15 年有效期的 TLS 证书,我觉得很好,不仅不用续期,还支持通配符,多个子域名也只需一个证书,这么好的东西怎么能不用呢?

在阿里云,通配符证书最便宜的是一年 1000 元的:

这是最便宜的了,至于更低价格的和免费的都不支持通配符。

没有这么凉心的国内厂商做对比,怎么能显出外国厂商的良心呢?国内营商环境疑似太好了,这要是放开了竞争早死完了。

等待 DNS 缓存更新

如果你要换成 15 年的 TLS 证书,建议在前面修改了 Name Server 的步骤之后,等待 4 - 8 小时左右,等到大多数地区的 DNS 缓存都更新了,再使用 15 年的证书。

为什么要等呢?因为 Cloudflare 给服务器颁发的 15 年 TLS 证书是“源服务器证书”,不能直接与客户端通信。

当 DNS 缓存更新后,访问网站的过程中会使用到两个 TLS 证书:

浏览器 ---- Cloudflare 的服务器(边缘证书) ---- 网站服务器(源服务器证书)

此时,当浏览器访问网站时(经过 Cloudflare 处理),它得到的不是 15 年有效期的源服务器证书,而是短期的边缘证书:

边缘证书的有效期通常是三个月,用于向浏览器证明这是与 saber.love 的通信,它的作用就类似于以前我在源服务器上使用的有效期为 3 个月的 Let's Encrypt 证书。

至于 15 年有效期的源服务器证书,只用于 Cloudflare 和服务器之间的“内部通信”,所以不用担心 15 年这么长时间会不会有安全问题。

从实际效果来说,就是 Cloudflare 作为一个中间人代替源服务器做出证明,并阻止客户端直接与源服务器通信,这样可以起到过滤网络请求、保护源服务器的作用。

如果你看到的是 15 年的源服务器证书,说明这次请求没有经过 Cloudflare 处理,而是直接访问源站 IP 的:

此时浏览器会显示证书错误的警告,因为这个证书只适合在 Cloudflare 内部使用。

顺便一提,用 hosts 通过 IP 直接访问本站的方法也会失效,因为上述的证书错误。

因此,为了避免客户端遇到证书出错的问题,就需要等待它的 DNS 缓存刷新为 Cloudflare 的 DNS 解析,然后我们再给网站启用 15 年的源服务器证书。

创建证书

在左侧选择“源服务器”,然后点击“创建证书”:

下一步可以进行一些配置,通常保持默认即可:

默认就有通配符证书,并且有效期是 15 年,真的太方便了。

之后就会生成证书,只有纯文本内容,需要自行保存:

将“源证书”的内容保存为文件 证书名字.pem,“私钥”的内容保存为 证书名字.key,保存到服务器上。

然后修改 WEB 服务器软件(如 Nginx)的配置,将原本的证书替换成这一对新的证书,最后重启 WEB 服务器软件生效。

生效后,你不会在浏览器里看到这个证书,因为前面说了,浏览器看到的是 Cloudflare 的边缘证书。

提示:

  1. 你不需要手动创建边缘证书,因为 Cloudflare 会自动创建边缘证书,并自动续期。
  2. 使用 15 年证书之后,应该把 TLS 加密模式设置为“完全(严格)”。

也是用上 Cloudflare 了

  1. 喵喵喵
    Google Chrome 128Google Chrome 128GNU/Linux x64GNU/Linux x64

    这个源服务器证书可不能和普通的证书对比呀。
    CF源服务器证书就是个自签证书,只不过被CF信任了而已。客户端通过CF CDN访问你服务器,看到的是别的证书。
    如果直接访问源站,是会提示证书不被信任的。
    你自己签一个100年的证书,本地客户端手动信任了,那也是可以的。
    普通的证书是无需客户端做任何操作就能被信任的。

    回复
    1. saber 文章作者
      Google Chrome 128Google Chrome 128WindowsWindows

      是的,不过 CF 的边缘证书是免费的(也有通配符),证书颁发机构是 Google Trust Services。阿里云的证书那么贵是因为要给证书品牌交钱吗?

      回复
      1. 喵喵喵
        Google Chrome 128Google Chrome 128GNU/Linux x64GNU/Linux x64

        有可能就是想捞钱。
        用Let's Encrypt也有通配符证书,不过就是要90天刷新一次。
        找个ACME脚本或者Lego配置自动化也是可以的。
        Lego:https://github.com/go-acme/lego
        我用这个生成通配符证书给局域网的设备使用,爽!

        回复