ログインが必要なサイトでは「サイトが過負荷です」というバナーを表示しない。匿名アクセスは存在しないため。

時折、フォーラムの上部にこのような通知が表示されることがあります。

過負荷のため、このページは一時的にログアウト状態のユーザーが閲覧するのと同様に表示されています。

これについていくつかの観察と質問があります。

まず、サーバーが過負荷状態にあるようには見えません。最後にこの警告が表示された際、サーバー監視ツールによると CPU 負荷のピークは 24%、メモリ使用量は 50% 強でした。また、ユーザーにとって明らかなパフォーマンス低下は発生していません。そこで疑問に思うのですが、この警告が表示される閾値は何であり、それは適切に設定されているのでしょうか。

次に、私にとってより重要なのは、私が運営するフォーラムは完全に非公開であるという点です。ログアウトしたユーザーはログインページ以外は何も閲覧できません。したがって、この通知は誤りです。つまり、ページが「ログアウト状態のユーザーが閲覧するのと同様に」表示されているわけではありません。なぜなら、そのようなユーザーはそもそもそれを閲覧できないからです。これにより、何度か混乱が生じています。具体的には、この通知によって「非公開フォーラムの投稿が突如として許可されていないユーザーに公開されるようになった」と誤解されるケースです。私も初めて見たときはかなり驚きましたし、時折、ユーザーからこれについての質問を受けることもあります。

もしかしたら、この警告文を書き換えるべきでしょうか。あるいは、非公開フォーラムでは表示を変更または無効化するべきでしょうか。

特定のフォーラムに対してこの通知を無効にすることは可能でしょうか。

「いいね!」 3

@meriksson さん、こんにちは

参考情報ですが、この通知はクッキーを介してトリガーされます:

if ($.cookie("dosp") === "1") {
        $.removeCookie("dosp", { path: "/" });
        notices.push(
          Notice.create({
            text: I18n.t("forced_anonymous"),
            id: "forced-anonymous"
          })
        );
      }

参照:

GitHub でこのクッキーを検索すると以下がヒットします:

force_anon はここで定義されています:

 def initialize(app, settings = {})
      @app = app
    end

    def call(env)
      helper = Helper.new(env)
      force_anon = false
      if helper.should_force_anonymous?
        force_anon = env["DISCOURSE_FORCE_ANON"] = true
        helper.force_anonymous!
      end

参照:

関連項目:

 MIN_TIME_TO_CHECK = 0.05
 ADP = "action_dispatch.request.parameters"

 def should_force_anonymous?
        if (queue_time = @env['REQUEST_QUEUE_SECONDS']) && get?
          if queue_time > GlobalSetting.force_anonymous_min_queue_seconds
            return check_logged_in_rate_limit!
          elsif queue_time >= MIN_TIME_TO_CHECK
            if !logged_in_anon_limiter.can_perform?
              return check_logged_in_rate_limit!
            end
          end
        end

   false
end
「いいね!」 4

それは良い指摘ですね、@sam。完全に非公開のサイトの場合、このコピーは混乱を招く可能性がありますし、もしかすると誤っているかもしれません。

「いいね!」 4

この警告は、NGINX がリクエストを Unicorn(アプリサーバー)に転送した際に、大きな遅延が発生した場合に表示されます。

例(誇張した表現):

  • NGINX:「ほら、1 時にユーザーから届いたリクエストだ」
  • 1 時間経過
  • アプリサーバー:「リクエストを受け取った……ええっ、届くのに 1 時間もかかった?これは過負荷だな」

この閾値は、以下の 2 つの設定で制御できます:

DISCOURSE_FORCE_ANONYMOUS_MIN_QUEUE_SECONDSDISCOURSE_FORCE_ANONYMOUS_MIN_PER_10_SECONDS

最も重要なのは、サーバーに十分な余力がある場合は、UNICORN_WORKERS を増やすことで Unicorn の数を増やすことです。

ログインが必要なサイトの場合、この警告をより深刻なもの(青い画面、レート制限に達しましたなど)に変更すべきかもしれません。

ログインが必要なサイトがこのレート制限に抵触するのは、今回が初めてです。ここをもっと改善すべきだという点に同意します。

「いいね!」 4

もう1件、独立したクレームが出るまでここで待ちます。

「ログインが必要」なサイトにおいて、極度の負荷下で私たちが最善とできることは、「サイトが過負荷です。後ほど再度お試しください」と表示する青い画面をレンダリングすることだけです。この機能を追加する前に少し待ち、もう1件クレームが出る様子を見たいと思います。

「いいね!」 3

私がよく訪れる非常に小規模な非公開の Discourse コミュニティで発生しています。502 Bad Gateway(Nginx エラー)が表示され、その後全く読み込まれなくなりました。最終的には読み込まれましたが、前述のバナーメッセージが表示されました。

「いいね!」 1

今追加しても安全だと思います。ログイン必須のサイトが過負荷の場合、ユーザーを増やしても状況は改善しません。

「いいね!」 3

もちろん…次のリリースに組み込みます

「いいね!」 3