头像迁移到 S3 兼容的 R2 后加载时间过长

哇,好的。这很可能就是关键线索,指向了另一个问题。

日志中出现 avatar_proxy 通常意味着 Discourse 拒绝直接从 Cloudflare R2 CDN 提供头像。相反,Discourse 会积极拦截请求,将图片从 R2 下载到本地服务器的 /tmp 文件夹,然后使用 Ruby 将图片提供给浏览器。因此,我认为这完全绕过了 CDN,也解释了 3 秒的延迟——我怀疑服务器是在每次请求时都手动获取并加载文件:grimacing:

Discourse 仅在少数非常特定的场景下使用 avatar_proxy,通常是因为隐私或安全设置强制服务器屏蔽外部 URL。

请在“管理”>“站点设置”中检查以下设置:

找到 external system avatars url(外部系统头像 URL)——如果该框中有任何内容(例如 /letter_avatar_proxy/v4/...),请将其清空。这应该能阻止 Discourse 代理默认的字母头像。同时也值得检查 uploaded avatars allowed groups(允许上传头像的组),确保其设置为 TL_0

另外,请再次检查 DISCOURSE_S3_CDN_URL,确保其正确无误,没有尾随斜杠或拼写错误?

重新映射自定义头像:
看起来您的数据库中仍然包含原始的 R2 存储桶 URL,而不是新的 CDN URL;由于它们不匹配,您的论坛可能出于安全原因正在代理它们。

在 Rails 控制台中检查,看看 Discourse 到底在应对什么:

./launcher enter app
rails c

选择一个头像加载缓慢的用户名

u = User.find_by_username("the_selected_username")
u.user_avatar.custom_upload.url

如果输出返回的是原始存储桶 URL,说明您之前的重新映射没有覆盖所有内容(也许遗漏了子域名或协议)。

要修复此问题,请 SSH 登录到您的服务器,再次进入容器(不是 Rails)(./launcher enter app),然后运行重新映射工具(再次运行,哈哈)以将原始 URL 替换为您的 CDN URL:

discourse remap "https://<your-raw-cloudflare-url>.r2.cloudflarestorage.com" "https://cdn.your-domain.com"

然后,以防万一,使用 // 代替 https:// 再运行一次。

顺便问一下,出于好奇,您使用的是哪家主机服务?我有和您类似的通用设置,但尚未遇到此问题。所以我也很感兴趣您的配置,并想尝试复现一下这个问题。