nextcloud 是开源的网盘系统,本文通过一些定制改造来加快其访问速度。
优化方向分为三大块:web 访问体验、php 性能优化、下载加速。
思路概述
后两项不是本文的重点,这里简单说一下思路:
- php 性能优化:启用 php-jit 加持,并对静态网页进行预处理缓存,以加快响应速度。
- 下载加速:将文件存储迁移到云存储,把下载链接通过 hook 替换为 CDN 地址,减轻 web 主服务器的压力。
web 访问体验优化
要优化 web 访问体验,需要先深入了解 nextcloud 的运作原理。通过分析发现以下几个关键点:
- 通过 F12 调试工具可以发现,页面加载的 js 脚本数量多、体积较大。因此可以将这些 js 文件迁移到 CDN,既能加速加载,又能减轻 web 主服务器的压力。
- 跟踪主页响应的 html 可以发现,nextcloud 采用了 defer src 的方式引用 js,这证明这些脚本可以通过外部 URL 加载,为 CDN 化提供了可能。
- 通过分析 php 代码,html 中的 js 引用生成逻辑主要位于 lib/private/TemplateLayout.php,因此只需修改这个文件即可实现 js 的 CDN 加速。
- nextcloud 默认开启了 http Content-Security-Policy,由于资源需要外联到 CDN,该策略必须相应修改,可在 php 代码中找到相关配置并注释掉。
CDN 存储与文件名转换
CDN 加速采用七牛云对象存储服务。由于对象存储不支持"文件+目录树"方式访问,只支持单 key,因此需要将 php 中的 js 引用路径格式改为单字符串形式。
例如:nextcloud/core/js/dist/main.js 需修改为 nextcloud_core_js_dist_main.js。
CSS 加速处理
css 的加速处理方式有所不同,由于 css 的特殊性(加载顺序依赖),这里的做法是将常用 css 按加载顺序合并为一个大的 css 文件,再对这个合并文件进行 CDN 加速。
效果验证
通过简单的试验,流量传输大头已从 web 服务器成功转移到了 CDN 上面。
具体做法是逐个分析每个 js 文件的原始 URL,推导出改造后的 CDN URL,如下图所示:
然后再写一个脚本,将 nextcloud 目录下的 js 文件名批量转换为上述格式,并上传到 CDN 对象存储即可。
需要注意的是,由于 nextcloud 存在 codesign 机制,修改源文件后需要查阅 code_signing.rst.txt 文档来更新 codesign,或者直接修改源代码将 codesign 去掉,才能保证正常访问。