meriksson
(Martin Eriksson)
2020 年 7 月 3 日午後 12:01
1
時折、フォーラムの上部にこのような通知が表示されることがあります。
過負荷のため、このページは一時的にログアウト状態のユーザーが閲覧するのと同様に表示されています。
これについていくつかの観察と質問があります。
まず、サーバーが過負荷状態にあるようには見えません。最後にこの警告が表示された際、サーバー監視ツールによると CPU 負荷のピークは 24%、メモリ使用量は 50% 強でした。また、ユーザーにとって明らかなパフォーマンス低下は発生していません。そこで疑問に思うのですが、この警告が表示される閾値は何であり、それは適切に設定されているのでしょうか。
次に、私にとってより重要なのは、私が運営するフォーラムは完全に非公開であるという点です。ログアウトしたユーザーはログインページ以外は何も閲覧できません。したがって、この通知は誤りです。つまり、ページが「ログアウト状態のユーザーが閲覧するのと同様に」表示されているわけではありません。なぜなら、そのようなユーザーはそもそもそれを閲覧できないからです。これにより、何度か混乱が生じています。具体的には、この通知によって「非公開フォーラムの投稿が突如として許可されていないユーザーに公開されるようになった」と誤解されるケースです。私も初めて見たときはかなり驚きましたし、時折、ユーザーからこれについての質問を受けることもあります。
もしかしたら、この警告文を書き換えるべきでしょうか。あるいは、非公開フォーラムでは表示を変更または無効化するべきでしょうか。
特定のフォーラムに対してこの通知を無効にすることは可能でしょうか。
「いいね!」 3
neounix
(Dark Matter)
2020 年 7 月 3 日午後 12:50
2
@meriksson さん、こんにちは
参考情報ですが、この通知はクッキーを介してトリガーされます:
if ($.cookie("dosp") === "1") {
$.removeCookie("dosp", { path: "/" });
notices.push(
Notice.create({
text: I18n.t("forced_anonymous"),
id: "forced-anonymous"
})
);
}
参照:
import getURL from "discourse-common/lib/get-url";
import I18n from "I18n";
import { bind, cancel } from "@ember/runloop";
import Component from "@ember/component";
import LogsNotice from "discourse/services/logs-notice";
import EmberObject, { computed } from "@ember/object";
const _pluginNotices = [];
export function addGlobalNotice(text, id, options = {}) {
_pluginNotices.push(Notice.create({ text, id, options }));
}
const GLOBAL_NOTICE_DISMISSED_PROMPT_KEY = "dismissed-global-notice-v2";
const Notice = EmberObject.extend({
text: null,
id: null,
options: null,
This file has been truncated. show original
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
参照:
関連項目:
# frozen_string_literal: true
require_dependency "mobile_detection"
require_dependency "crawler_detection"
require_dependency "guardian"
module Middleware
class AnonymousCache
def self.cache_key_segments
@@cache_key_segments ||= {
m: 'key_is_mobile?',
c: 'key_is_crawler?',
b: 'key_has_brotli?',
t: 'key_cache_theme_ids',
ca: 'key_compress_anon'
}
end
# Compile a string builder method that will be called to create
This file has been truncated. show original
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
sam
(Sam Saffron)
2020 年 7 月 6 日午前 8:53
4
この警告は、NGINX がリクエストを Unicorn(アプリサーバー)に転送した際に、大きな遅延が発生した場合に表示されます。
例(誇張した表現):
NGINX:「ほら、1 時にユーザーから届いたリクエストだ」
1 時間経過
アプリサーバー:「リクエストを受け取った……ええっ、届くのに 1 時間もかかった?これは過負荷だな」
この閾値は、以下の 2 つの設定で制御できます:
DISCOURSE_FORCE_ANONYMOUS_MIN_QUEUE_SECONDS と DISCOURSE_FORCE_ANONYMOUS_MIN_PER_10_SECONDS
最も重要なのは、サーバーに十分な余力がある場合は、UNICORN_WORKERS を増やすことで Unicorn の数を増やすことです。
ログインが必要なサイトの場合、この警告をより深刻なもの(青い画面、レート制限に達しましたなど)に変更すべきかもしれません。
ログインが必要なサイトがこのレート制限に抵触するのは、今回が初めてです。ここをもっと改善すべきだという点に同意します。
「いいね!」 4
sam
(Sam Saffron)
2020 年 11 月 4 日午前 3:33
7
もう1件、独立したクレームが出るまでここで待ちます。
「ログインが必要」なサイトにおいて、極度の負荷下で私たちが最善とできることは、「サイトが過負荷です。後ほど再度お試しください」と表示する青い画面をレンダリングすることだけです。この機能を追加する前に少し待ち、もう1件クレームが出る様子を見たいと思います。
「いいね!」 3
私がよく訪れる非常に小規模な非公開の Discourse コミュニティで発生しています。502 Bad Gateway(Nginx エラー)が表示され、その後全く読み込まれなくなりました。最終的には読み込まれましたが、前述のバナーメッセージが表示されました。
「いいね!」 1
今追加しても安全だと思います。ログイン必須のサイトが過負荷の場合、ユーザーを増やしても状況は改善しません。
「いいね!」 3