neounix
(Dark Matter)
22
你好 @Iceman
你并没有错。你只是在尝试解决问题,或许是因为你的 YouTube 嵌入内容无法正常工作而感到沮丧……
当你运行以下命令时:
# time rake posts:rebake_match['youtube',string,100]
116 / 76598 (0.2%)-
由于延迟设置为 100 秒,每 100 秒只会重新烘焙一篇文章。你还有将近 77,000 篇文章需要重新烘焙(使用此模式),因此大约需要 90 天才能完成。我之前使用 100 只是一个示例,并非推荐,如果我让你感到困惑,非常抱歉 
即使你将延迟改为 10 秒,重新烘焙过程仍需要大约 9 天。
你实际上希望以什么速率重新烘焙你的“YouTube 帖子”?
作为管理员,你可以轻松地在每篇帖子下方点击按钮来运行“重建 HTML”。
Iceman
(Iceman)
27
感谢 @neounix
我在单个包含 YouTube 链接的帖子中进行了测试:
root@cont-web-only:/var/www/discourse# rake posts:rebake_match['icemanworkingonthisheadache',string,5]
1 / 1 (100.0%)
1 posts done!
随后我检查了该帖子,但它仍然只显示链接,没有显示预览框。(已尝试清除缓存、清除 Cookie,甚至换了另一台电脑测试 :P)
感谢 @Overgrow。
此外,我在同一帖子和另一个帖子上,分别在运行上述 rebake 命令之前和之后尝试了该操作,但均未成功。
neounix
(Dark Matter)
28
嘿 @iceman,
这是一个重要的线索;现在我们知道了,即使使用 rake 任务重新烘焙单个帖子也无法解决你的问题(也确认了如 @Overgrow 所建议的,从 UI 进行 HTML 重建也不起作用),这正是你之前想告诉我们的。
感谢你一步步的故障排查。
让我再思考一下;同时,既然问题越来越清晰,其他人可能也会有一些想法。
编辑:
@Iceman
请在这里发布一个你遇到问题的 YouTube 链接(也许是你添加了 ‘icemanworkingonthisheadache’ 文本的那个),让我们确认一下单框预览在这里是否有效(我也会在我的一个测试站点上尝试)。
Iceman
(Iceman)
29
没问题 @neounix
任何 YouTube 视频都会出现这种情况,但为了保持一致性,我特意测试了以下两个视频:
编辑:是的,它们在这里确实可以工作。
另外需要注意的是,在我的安装环境中,它们无法在预览面板中显示。
neounix
(Dark Matter)
30
但其他所有“非 YouTube”的单框内容在您的网站上 @Iceman 是否都正常渲染?
Iceman
(Iceman)
31
你好 @neounix
是的,其他所有一键嵌入功能均按预期工作:Discourse、WordPress、SoundCloud、Facebook、Twitter、Vimeo 等。只有 YouTube 显示为 URL。
riking
(Kane York)
32
可以尝试的一个方法是:通过你的服务器代理登录 Google 并访问 YouTube 网站,看看是否会返回任何“有趣”的错误信息。
好吧,如果你无法让新添加帖子的编辑器中的 Onebox 正常工作,那么重新处理旧帖子就没有意义了。
你需要先让 Onebox 对新帖子生效(至少要在预览面板中正确显示)。
另外……从 UI 进行 HTML 重建 = 重新处理。
Iceman
(Iceman)
34
因此,经过一周的反思,我取得了一些进展,但最终还是遇到了瓶颈。
-
上述提到的所有细节仍然适用。
-
在进行了超负荷的调试后,问题最终被定位如下:当我创建新的 Droplet 时,我借此机会更新了一些当初在原始 Droplet 上无法完成的内容。其中之一就是 IPv6。结果发现,由于某种宇宙般的原因,Digital Ocean 的 IPv6 地址范围大部分被 Google 封禁了。 所以,给未来的建议是:如果你正在设置 Digital Ocean 上的 Discourse 安装,请不要启用 IPv6,因为一旦启用就无法移除,你只能更换 Droplet。
-
修正该问题后,一切按预期运行。然而,由于正常的业务增长(以及 Alphabet 近期的一些策略),我又回到了原点,因为现在 我遇到了这个错误,而且我不知道有任何方法可以“阻止”Discourse 处理 Onebox(我甚至尝试将 YouTube 域名加入黑名单,但无济于事)。这是因为根据我链接的那篇帖子,“这个问题应该在一小时后自行消失”,但我无法暂停我的 rebake 操作……或者我可以吗?我应该这样做吗?其他方案涉及在服务器端进行更改,但这意味着……增加更多 IP?在 Onebox 调用中强制使用“X-Forwarded-For”?
-
另外,还有一个附加问题:为什么 Discourse 要“承担”调用 YouTube 的负载?我的意思是,这个错误表明是服务器的 IP 被标记为执行了所有调用(是的,这是因为 Onebox 的展开功能),但……为什么这不归结为用户加载页面时的行为?是为了性能考虑吗?
neounix
(Dark Matter)
35
你好 @Iceman
作为一个权宜之计,我为你测试了这段(不太优雅)的 CSS,它似乎能阻止 onebox 的处理;这有点像“用大锤打苍蝇”的方法,你可以随时启用或禁用(添加或移除),直到你找到更好的方案。试试看吧:
.onebox-body{
display:none;
}
希望这能帮到你。
注意:
我在一些 onebox 链接上测试过,onebox 消失了,但链接仍然保留;但并未进行详细测试,抱歉。
请立即停止当前的处理。你知道是什么触发了正在运行的重新烘焙吗?是后台任务吗?如果是,只需将“重新烘焙旧帖子数量”设置降低为零。
之后,你可以使用正则表达式匹配并延迟重新烘焙选定的 YouTube 帖子。
Iceman
(Iceman)
37
首先,感谢你们两位 @neounix @Overgrow
关于这一点:
我会尽快测试。只要它能帮我阻止处理,我就非常乐意 
关于 @Overgrow 的问题:
我最近(多亏了你们)学会了如何进行自定义 rebake、执行一些查询以及施展“黑暗魔法”。不过,我能否请教一下,我该如何知道或查询这一点:
我的意思是……这需要在 Ruby 控制台中操作,还是通过在 Sidekiq 中终止某个进程……?
riking
(Kane York)
38
rebake old posts count 控制每 15 分钟 处理多少条被各种 rake 任务标记的帖子。
Iceman
(Iceman)
39
你好 @riking,
感谢你的反馈。有个小问题……该如何更改该设置?通过 Rails 控制台吗?
Iceman
(Iceman)
41
天哪,我觉得自己好蠢
谢谢 @neounix!
不过我不能把它设为零。UI 提示该值应在 1 到 2000000000 之间。所以我猜我会把它设为 1,再配合你的那个技巧……这样应该能让我看看封禁是否会被解除。
(因为其他选项要麻烦得多,比如使用新 IP、负载均衡器,或者直接在所有请求上强制设置 X-Forwarded-For,我可不想把 Discourse 的正常运作搞砸了
)
稍后更新!
neounix
(Dark Matter)
42
供参考……如果你需要将其设置为零,通常可以通过直接执行数据库 UPDATE 查询(或 Rails,对此我不太了解)来实现。
Iceman
(Iceman)
43
唉,没成功。我把它设为值 1,并加了个不显示任何内容的变通方法,但五个小时过去了,封禁依然存在。最糟糕的是?显然无法联系到他们,所以我只能瞎猜解决办法。
你需要耐心等待。根据我的经验,解封可能需要 2 到 3 天。请确保不再向该 IP 发送任何请求。
你可以检查是否还有需要运行的重新烘焙(rebake)任务。提示在代码中(这行代码会选中需要后台重新烘焙的帖子,受 rebake old posts count 设置限制):
你需要查找符合以下条件的帖子:
WHERE (((baked_version IS NULL) OR (baked_version < 2)) AND (deleted_at IS NULL))