ログイン後のユーザー固有の502エラー — DiscourseUpdates.has_unseen_features? に起因

こんにちは。

Discourseで、ログイン後に特定の管理者アカウントでのみ502エラーが発生するという奇妙な問題に直面しています。

  • 匿名ユーザーは通常通りサイトにアクセスできます。
  • 他のユーザーアカウントはログインしてサイトを通常通り使用できます。
  • 問題は特定の1つのアカウント(管理者アカウント)でのみ発生します。

:puzzle_piece: 環境

  • Discourseは公式Dockerセットアップを使用してインストールされています。
  • リバースプロキシ/CDN: ArvanCloud(Cloudflareに類似)
  • インターネットへのアクセスは制限/不安定です(GitHubや一部の外部サービスに到達できません)。
  • Discourseは約1か月間更新されていません

:red_exclamation_mark: 症状

サイトにアクセスすると:

  • プライベート/シークレットモードでサイトを開くと → サイトは正常に読み込まれます。
  • メインアカウントでログインすると → すぐに502 Bad Gatewayが表示されます。
  • 別のアカウントでログインすると → すべて正常に動作します。

したがって、問題は明らかにユーザー固有であり、認証後にトリガーされています。


:page_facing_up: CDN (ArvanCloud) のエラーログ

主に2つのエラーが表示されます。

1. アップストリームで読み取り中にアップストリームがタイムアウトした

upstream timed out (110: Connection timed out) while reading upstream

影響を受けるURLは主にアセットであり、例として:

  • /assets/browser-detect-*.js
  • /assets/plugins/automation-*.js
  • /assets/plugins/discourse-gamification-*.js
  • /assets/plugins/discourse-lazy-videos-*.js

2. アップストリームが接続を早めに切断した

upstream prematurely closed connection while reading response header from upstream

例として:

  • /stylesheets/common_theme_rtl_*.css
  • /theme-javascripts/*.js

つまり、CDNはDiscourseからの応答を待っていますが、バックエンドがタイムアウトするか接続を切断しています。


:magnifying_glass_tilted_left: バックエンドで確認したこと

Railsのスタックトレースでは、エラーパスは以下を指しています。

  • current_user_serializer.rb
  • discourse_updates.rb
  • メソッド: DiscourseUpdates.has_unseen_features?

これは、クラッシュ/タイムアウトがログインユーザーの新しい機能の通知を確認している間に発生していることを示唆しています。

影響を受けているユーザーが1人だけであるため、これはグローバルなサイトレンダリングではなく、ユーザー固有のシリアライズ中に問題がトリガーされていることを強く示唆しています。


何かご指導いただけると幸いです。
よろしくお願いいたします。

他のブラウザ/デバイスで試しましたか?ブラウザの拡張機能を無効にしてみましたか?

編集:もしかして誤解しました。シークレットモードで、かつユーザーとしてログインした状態でサイトは読み込まれますか?

はい、複数のデバイスとブラウザでテストしましたが、ブラウザ拡張機能とは関係ありません。

見ているのはデバイス固有ではなく、ユーザー固有のものです。

  • 管理者アカウントがすでにログインしていたどのデバイスでも、サイトを開くとすぐに502 Bad Gatewayになります。

  • シークレット/プライベートモードでは、サイトは正常に読み込まれ、ログインページにアクセスできます。

  • そこから、別の(管理者ではない)アカウントで正常にログインでき、サイトは正常に動作します。

  • しかし、管理者アカウントでログインしようとすると、メールアドレスとパスワードを送信した直後に一貫して502が表示され、ページが読み込まれません。

「いいね!」 1