当网站需要登录时,不显示“网站过载”横幅,因为不存在匿名访问

我们偶尔会在论坛顶部收到这样的通知:

由于负载极高,当前页面将暂时以未登录用户的视角向所有人显示。

关于这一点,我有几点观察和疑问:

首先,服务器似乎并未处于极高负载状态。上次我看到该警告时,服务器监控显示 CPU 负载峰值仅为 24%,内存使用率略高于 50% 等。据我所知,用户并未察觉到明显的性能下降。因此我想知道:触发该警告的阈值是多少?其设定是否合理?

其次,也是对我而言更为重要的是,我所运营的论坛是完全私密的。未登录用户除了登录页面外,无法查看任何内容。因此,该通知并不准确,即页面并非“以未登录用户的视角显示”,因为未登录用户根本无法看到该页面。这曾多次引发误解,让人误以为我们私密论坛的帖子突然对未授权用户开放了。我第一次看到该通知时也曾十分担忧,并且不时有用户就此向我提问。

是否可以考虑重写该警告?或者针对私密论坛禁用或更改该通知?

是否可以为特定论坛禁用此通知?

3 个赞

你好 @meriksson

供参考。此通知是通过 Cookie 触发的:

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

参考:

在 GitHub 上搜索此 Cookie 得到:

其中 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 个小时才收到请求……我肯定过载了。

您可以通过以下两个设置来控制阈值:

DISCOURSE_FORCE_ANONYMOUS_MIN_QUEUE_SECONDSDISCOURSE_FORCE_ANONYMOUS_MIN_PER_10_SECONDS

最重要的是,如果您的服务器有充足的额外容量,请通过增加 UNICORN_WORKERS 来添加更多 Unicorn 进程。

如果某个站点要求登录,那么我们或许应该将警告改为更严重的提示(例如蓝屏,表示您已被限流)。

这是我第一次听说有要求登录的站点触达此限流阈值。我们同意应在此方面做得更好。

4 个赞

我打算再等一条独立的投诉。

在极端负载下,对于“需要登录”的网站,我们目前能做的最好的事情就是显示一个蓝色屏幕,提示“网站负载过高,请稍后重试”。我想再等一等,看看是否会有另一条投诉,然后再决定是否添加此功能。

3 个赞

这发生在我经常访问的一个非常小型的私有 Discourse 社区上。它先是返回了 502 网关错误(Nginx),随后完全无法加载。最终页面加载成功了,但显示了我刚才提到的横幅消息。

1 个赞

我认为现在添加这个功能是安全的。如果某个需要登录的网站已经过载,增加更多用户并不会改善他们的体验。

3 个赞

好的……已安排到我们的下一个版本中。

3 个赞