大量资源随机返回 500 错误

访问我的网站时,有时会出现大量 JavaScript 文件的 500 错误,通常发生在首次页面加载时(即使这些文件已经缓存或应该被缓存)。有时错误信息会显示 NS_ERROR_CORRUPTED_CONTENT

我的主题加载正常(背景已移除以提高可见性),除此之外应该没有其他导致此问题的原因。只需等待 30 秒并重新加载即可修复。

我的网站已更新至几乎最新的提交版本(落后 2 个提交),日志中也没有任何异常。我的磁盘集群状态健康。这是什么原因导致的,我该如何修复?

我最初的猜测是 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 静态资源的硬件瓶颈。

这是我之前不知道的情况,确实能解释问题。所有服务器手册都指出,橙色 LED 闪烁意味着硬盘已完全损坏。但如果这些硬盘出现 I/O 超时或其他异常行为,那么 Discourse 返回 500 错误代码也就说得通了。

非常 反对订阅制。从长远来看,等价格合适时咬牙购买新的 SSD 可能更合理。如果花 150 美元为这台我永久拥有的服务器购买新 SSD,我宁愿这样做,也不愿永远每月向 Cloudflare 支付 5 美元。如果它确实是免费的(正如你所说),我可能会在等待这个 AI 泡沫破裂期间,将其作为临时替代方案来研究一下 :slight_smile: