更新到 3.4.0.beta1-dev 后大量出现 HTTP 502 和 429 错误

Discourse 版本:3.4.0.beta1-dev (bf3d8a0a94)

昨天更新后,我按照此处的建议禁用了 Cloudflare 的 minify 功能:

然而,从那时起,许多用户(包括我)都遇到了多次 502(网关错误)和 529(请求过多)的错误。

为了尝试缓解这个问题,我还遵循了本指南:

但这些错误的发生频率似乎没有任何改变。

更新发生在昨天上午 11 点左右。我进行了完全重建,因为我还想禁用一个插件。

我有一个 Prometheus+Grafana 实例来监控服务器和 discourse,但服务器在加载方面似乎没问题:

Discourse 指标(昨天上午 11 点左右指标下降是重建导致容器关闭):

同样,我没有看到任何奇怪的模式。

然而,这是刚才浏览器控制台的截图,在我尝试向用户发送私信后:

如果还需要其他任何信息(任何类型的日志),请随时提出。谢谢。

另外,如果这有帮助的话,“后台”的许多实时操作也明显滞后。

例如,已读主题未被注册为已读。

只是为了确保,你也完成了这一步,然后重新构建,对吗?

1 个赞

是的,抱歉,我忘了补充,很久以前我已经将 Cloudflare 模板添加到了 app.yml 文件中。我们从第一天起就一直使用 Cloudflare。

这是 app.yml 的一部分,我们有自己的证书独立续订,这就是为什么 letsencrypt 的被注释掉了:

## 这是集成式、独立的 Discourse Docker 容器模板
##
## 更改此文件后,您必须重建
## /var/discourse/launcher rebuild app
##
## 编辑时请务必*非常*小心!
## YAML 文件对空格或对齐错误非常非常敏感!
## 如有需要,请访问 http://www.yamllint.com/ 来验证此文件

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## 如果您想添加 Lets Encrypt (https),请取消注释这两行
  - "templates/web.ssl.template.yml"
#  - "templates/web.letsencrypt.ssl.template.yml"
  - "templates/cloudflare.template.yml"

## 此容器应暴露哪些 TCP/IP 端口?
## 如果您希望 Discourse 与 Apache 或 nginx 等其他 Web 服务器共享端口,
## 请参阅 https://meta.discourse.org/t/17247 获取详细信息
expose:
  - "80:80"   # http
  - "443:443" # https

[... ]

/logs 的摘录

我看到这被移到了 Installation,只是为了清楚起见,这不是新安装。

这个 discourse 实例自 2023 年 3 月以来一直在运行,从未出现过这个特定问题。

过去曾出现过一些 529 问题,但后来已得到解决。

我认为它仍然适合

4 个赞

看起来您的 PostgreSQL 已不堪重负。看起来您的大部分 RAM 都处于空闲状态,我建议尝试调整数据库以使用它,然后看看情况如何。

1 个赞

/sidekiq/queues 是什么样子的?
您是从哪个版本更新的?

1 个赞

从 5 月 6 日的最新稳定版 v3.2.1 到最新的 test-passed

Sidekiq 队列:

Dead job 部分是这个,但似乎自古以来就是同一个 job。

最旧的条目:

重试中的似乎是同一个 job 被一遍又一遍地重试。

但是……为什么突然出现这种情况?仅仅是应用程序层更新之后?

我正在使用 discourse prometheus exporter 插件。
如果我在虚拟机上添加一个 postgresql exporter 作为另一个容器,是否可以允许它访问 discourse postgresql 安装上的指标?

关于如何微调 discourse 的数据库,是否有更精确的指导?

不确定是否相关,但这肯定是在更新后开始发生的,点击未读标签中的“忽略”按钮总是返回 503。

既然似乎没有解决方案,我将尝试回滚到最新的 stable 版本,因为它应该是……你知道的,稳定的

祈祷没有核心依赖项破坏构建过程,就像上次一样

你不能从 tests-passed 回到 stable,除非有更高版本的 stable 可用。所以你下次有机会是在 3.4.0 发布时,我估计那是在圣诞节左右或之后……

再说,你总有一天得咬紧牙关挺过去。

1 个赞

好吧,我刚做完了。似乎在工作。反正我们也不关心 3.3.0 中的任何功能。

我会看看是否还有问题。最坏的情况是我们仍然会遇到大量的 429 和 502,变化不大。

如果能指导我如何配置 Discourse 上的 Postgres 以获得更多可用资源,我将不胜感激。

编辑:已部署 3.2.5 版本。系统似乎稳定。

下次报告问题时,请提醒我们你已完成此操作 :wink:

1 个赞

我总是在报告问题时提及我所在的版本。
我认为重要的是要记住,正是因为这是开源软件,所以应该考虑关键问题,而不是写诸如以下内容:

这是人们不遗余力地切换到“稳定”版本,遇到一些因未部署最受欢迎的版本而出现的 bug 的又一个例子。

stable 应该意味着“稳定”,而不是“遗留”时。
像 discourse docker 这样的核心依赖项在没有标签系统的情况下被推送的事实,足以让您在回应报告问题的用户时稍微谦虚一点。

我当时说的是,当你技术上无法降级时,提及你降级的事实。

我认为记住这一点很重要……我不为 Discourse 工作,我是在利用自己的业余时间帮助你,所以我并不欣赏你的语气,也无法处理你的反馈。

2 个赞

2 个赞