nextcloud 是开源的网盘系统,本文通过一些定制改造来加快其访问速度。

优化方向分为三大块:web 访问体验、php 性能优化、下载加速。

思路概述

后两项不是本文的重点,这里简单说一下思路:

  • php 性能优化:启用 php-jit 加持,并对静态网页进行预处理缓存,以加快响应速度。
  • 下载加速:将文件存储迁移到云存储,把下载链接通过 hook 替换为 CDN 地址,减轻 web 主服务器的压力。

web 访问体验优化

要优化 web 访问体验,需要先深入了解 nextcloud 的运作原理。通过分析发现以下几个关键点:

  1. 通过 F12 调试工具可以发现,页面加载的 js 脚本数量多、体积较大。因此可以将这些 js 文件迁移到 CDN,既能加速加载,又能减轻 web 主服务器的压力。
  2. 跟踪主页响应的 html 可以发现,nextcloud 采用了 defer src 的方式引用 js,这证明这些脚本可以通过外部 URL 加载,为 CDN 化提供了可能。
  3. 通过分析 php 代码,html 中的 js 引用生成逻辑主要位于 lib/private/TemplateLayout.php,因此只需修改这个文件即可实现 js 的 CDN 加速。
  4. 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 去掉,才能保证正常访问。