大量资源随机返回 500 错误

我最初的猜测是 Cloudflare 的优化问题——请确保已禁用 Rocket Loader(它可能已经禁用,但检查一下也无妨)。

另外,我认为如果你打算继续使用当前的硬件,可能需要使用 Cloudflare R2 配置 S3 兼容的对象存储。

你在聊天中提到,你使用了一些捐赠的旧 SSD,并且是在问题出现前不久安装的,这简直就是罪魁祸首——Dell 固件显示它们有问题,但 smartctl 显示正常。我认为 Dell 固件闪烁橙色指示灯是因为它检测到了高延迟和异常的 I/O 响应,或者固件不受支持。Discourse 会要求磁盘同时读取数十个编译好的 JavaScript 文件,而这些老旧且不受支持的 SSD 在这种突然爆发的 I/O 压力下可能会不堪重负。存储控制器在尝试获取数据时挂起,经过恰好 30 秒后超时——这是一个常见的 SCSI/块设备默认超时时间。

由于磁盘挂起 30 秒,Discourse 的 Rails/Nginx 在尝试获取文件时崩溃或超时,并抛出 500 错误。Cloudflare 很可能捕获了这些 500 错误,并应用了错误的头部信息传递给浏览器,从而导致你看到的 NS_ERROR_CORRUPTED_CONTENT 错误。

更换这些 SSD,或者如果你必须使用它们,那么请使用对象存储桶来卸载 Discourse 的静态资源和上传内容——你可以使用 Cloudflare R2 的免费 S3 兼容服务(我自己在用,效果很好)。这样你的服务器就不需要从这些故障 SSD 上读取成千上万个小文件,因为它绕过了 Web 静态资源的硬件瓶颈。