站点头像

Citrino's Cafe

少女祈祷中……

使用 Vercel 加速网站静态文件

2022年4月5日 由 Citrino

博客已经咕咕咕好久了,大概是因为我最近在忙着学习(其实是在忙着研究二次元和网站)

这几天遇到了一个问题:受限于我国奇妙的网站备案政策,有些论坛站点不得不托管在境外,而论坛需要加载的文件又比较多,以 Cloudflare 用户为首的拮据站长们不得不忍受大量资源文件加载的缓慢。针对这一问题,一种比较好的办法是做动静分离,也就是借用一个已备案的子域名,用国内 CDN 反代网站的静态文件(CSS、JavaScript、图片等),然后从这个子域名处加载这些文件。不过,如果你担心阿里云、腾讯云这些按流量计费的 CDN 被刷得一夜暴负,又不想用百度云加速的话,Vercel 是个不错的选择。

本文以 Discuz! X3.4做演示。目前国内用户会被 Vercel Anycast 到日本东京、新加坡等地的节点,速度比较理想,但不排除 Vercel 未来网络质量恶化的可能,而且加载新域名的资源需要一次 DNS 查询和三次 TCP(TLS 连接还要多一次)握手,容易导致渲染阻塞。因此,用境外的 Vercel 做动静分离时,不建议分离 CSS 和 JavaScript 文件。对于 Discuz,分离 static 目录下的文件即可。

境内访问效果

一、准备文件

进入宝塔面板、FTP 等文件操作工具,将整个 static 目录压缩、下载,并在你的电脑上将压缩包解压。也可以尝试其他的批量下载文件的方法。未对 static 目录进行修改的话也可以直接使用原版文件。

二、反代域名配置

Vercel 有强大的反向代理能力,让 Vercel 直接反代源站也是一种选择;不过,也可以将静态文件托管到 GitHub,让 Vercel 从 GitHub 仓库获取文件,避免增加源站的压力。你需要一个 GitHub 账号←废话✕1,接着到 vercel.com 连接你的 GitHub 账号并注册 Vercel 账号←废话✕2

首先创建一个 GitHub 仓库,仓库名任取,仓库类型设为私有。接着,使用 Git 将刚刚下载的 static 目录下的全部文件推送到此仓库,最终的效果如下:

仓库最终效果

然后转到 Vercel 控制台,点击 New Project,关联 GitHub 源后导入刚才的仓库,并按提示进行部署。部署成功后,进入项目控制台,按下图绑定子域名。

添加域名

打开域名解析控制台,为 static.xxx.com 添加一条解析记录:

CNAME static.xxx.com cname.vercel-dns.com

这里使用 CNAME 而非 A 记录的原因是 Vercel 由于被滥用(之前76.76.21.21就是因此被和谐的,但 Vercel 持有的 IP 比较多,有能力应对这类问题)以及一些其他原因,IP 时有变动。接下来需要等待 Vercel 为该域名签发 SSL 证书。等到 Vercel 自定义域名处显示 Valid Configuration,配置即完成。

三、修改配置

第一处,打开网站 config 目录下的 config_global.php 文件,将

$_config['output']['staticurl'] = 'static/';

修改为

$_config['output']['staticurl'] = 'https://static.xxx.com/';

变量值末尾的斜杠不应省去。修改完成后保存文件。

第二处,打开管理中心,打开“模板”标签页,点击当前正在使用的模板的“编辑”链接,将“界面基础图片目录 {IMGDIR}”一项修改为:

https://static.xxx.com/image/common

注意,末尾处不要加斜杠。将页面滚动到最下方,点击“提交”按钮。路径修改完成后到“工具”标签页更新缓存。四个项目最好都勾选。

选择全部缓存项目

四、测试及其他注意事项

访问你的站点,静态资源文件(如界面图片)将会从 static.xxx.com 加载。当页面需要加载的文件总数高于 HTTP 协议的并发限制时,动静分离的优势就比较明显了。当然,也可以在此基础上根据站点的实际情况加以调整,比如添加更多的子域名、变更仓库目录结构等。

值得注意的是,Vercel 免费计划限制每月100G的流量;且根据其过去的网络策略来看,目前的网络连接质量难以长期保持。另外,如果修改了 static 目录下的文件,需要重新推送到 GitHub。