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

**URL:** <https://meta.discourse.org/t/when-a-site-requires-login-do-not-show-site-is-overloaded-banner-there-is-no-anon-access/156688>\
**Category:** Feature\
**Created:** [2020年七月3日 12:01 UTC](https://meta.discourse.org/t/when-a-site-requires-login-do-not-show-site-is-overloaded-banner-there-is-no-anon-access/156688 "2020-07-03T12:01:53Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![meriksson](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/meriksson/32/66712_2.png) [@meriksson](https://meta.discourse.org/u/meriksson)\
**Post date:** [2020年七月3日 12:01 UTC](https://meta.discourse.org/t/when-a-site-requires-login-do-not-show-site-is-overloaded-banner-there-is-no-anon-access/156688/1 "2020-07-03T12:01:53Z")

</div>

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

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

关于这一点，我有几点观察和疑问：

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

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

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

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

---

<div class="post-metadata">

**Author:** ![neounix](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/neounix/32/215617_2.png) [@neounix](https://meta.discourse.org/u/neounix)\
**Post date:** [2020年七月3日 12:50 UTC](https://meta.discourse.org/t/when-a-site-requires-login-do-not-show-site-is-overloaded-banner-there-is-no-anon-access/156688/2 "2020-07-03T12:50:56Z")

</div>

> [@meriksson](#):
>
> 所以我想问：这个警告的阈值是多少，它是否合理校准？

你好 @meriksson

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

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

```

参考：

> <https://github.com/discourse/discourse/blob/ba00cc8ec457ce708cc1aec5d25afc38495cc52a/app/assets/javascripts/discourse/app/components/global-notice.js>

在 GitHub 上搜索此 Cookie 得到：

> **[Build software better, together](https://github.com/search?q=repo%3Adiscourse%2Fdiscourse+dosp)**
>
> GitHub is where people build software. More than 150 million people use GitHub to discover, fork, and contribute to over 420 million projects.

其中 force\_anon 位于此处：

```plaintext
 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

```

参考：

> **[Build software better, together](https://github.com/search?q=repo%3Adiscourse%2Fdiscourse+force_anon)**
>
> GitHub is where people build software. More than 150 million people use GitHub to discover, fork, and contribute to over 420 million projects.

另请参阅：

> <https://github.com/discourse/discourse/blob/19814c5e8109dfb30b8a96e0762d062b200db392/lib/middleware/anonymous_cache.rb>

```plaintext
 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

```

---

<div class="post-metadata">

**Author:** ![codinghorror](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/codinghorror/32/110067_2.png) [@codinghorror](https://meta.discourse.org/u/codinghorror)\
**Post date:** [2020年七月3日 14:30 UTC](https://meta.discourse.org/t/when-a-site-requires-login-do-not-show-site-is-overloaded-banner-there-is-no-anon-access/156688/3 "2020-07-03T14:30:14Z")

</div>

> [@meriksson](#):
>
> 我运营的论坛是完全私密的。未登录用户除了登录页面外看不到任何内容。因此，该通知是不准确的，也就是说，该页面_并未_以未登录用户视角显示，因为此类用户根本无法看到它。

@sam 说得很好，在完全私密的网站上，这段文案确实会造成混淆……甚至可能是不正确的。

---

<div class="post-metadata">

**Author:** ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)\
**Post date:** [2020年七月6日 08:53 UTC](https://meta.discourse.org/t/when-a-site-requires-login-do-not-show-site-is-overloaded-banner-there-is-no-anon-access/156688/4 "2020-07-06T08:53:14Z")

</div>

> [@meriksson](#):
>
> 首先，服务器似乎并未处于极端负载状态。上次我看到该警告时，服务器监控显示 CPU 负载峰值为 24%，内存使用率略高于 50% 等。据我所知，用户并未察觉到性能明显下降。因此我想知道：此警告的阈值是多少？其校准是否合理？

当 NGINX 将请求转发给 Unicorn（应用服务器）并检测到显著延迟时，会出现此警告。

例如（夸张情况）：

- NGINX 说：嘿，这里有一个用户在下午 1 点提交的请求。
- 过了 1 个小时。
- 应用服务器收到请求：天哪，我花了 1 个小时才收到请求……我肯定过载了。

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

> <https://github.com/discourse/discourse/blob/38a30a6e961dc28d473709d47c5a357eab64998d/config/discourse_defaults.conf#L227-L230>

`DISCOURSE_FORCE_ANONYMOUS_MIN_QUEUE_SECONDS` 和 `DISCOURSE_FORCE_ANONYMOUS_MIN_PER_10_SECONDS`

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

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

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

---

<div class="post-metadata">

**Author:** ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)\
**Post date:** [2020年十一月4日 03:33 UTC](https://meta.discourse.org/t/when-a-site-requires-login-do-not-show-site-is-overloaded-banner-there-is-no-anon-access/156688/7 "2020-11-04T03:33:40Z")

</div>

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

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

---

<div class="post-metadata">

**Author:** ![anon82467725](https://avatars.discourse-cdn.com/v4/letter/a/edb3f5/32.png) [@anon82467725](https://meta.discourse.org/u/anon82467725)\
**Post date:** [2020年十二月9日 17:35 UTC](https://meta.discourse.org/t/when-a-site-requires-login-do-not-show-site-is-overloaded-banner-there-is-no-anon-access/156688/8 "2020-12-09T17:35:33Z")

</div>

> [@sam](#):
>
> 我再等一个独立的投诉。

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

 ![InkedScreen Shot 2020-12-09 at 12.29.25 PM_LI](https://global.discourse-cdn.com/meta/original/3X/9/f/9f25b2031b4a59cdd218d0c41c099ce7defbf24f.jpeg)

---

<div class="post-metadata">

**Author:** ![codinghorror](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/codinghorror/32/110067_2.png) [@codinghorror](https://meta.discourse.org/u/codinghorror)\
**Post date:** [2020年十二月9日 23:42 UTC](https://meta.discourse.org/t/when-a-site-requires-login-do-not-show-site-is-overloaded-banner-there-is-no-anon-access/156688/10 "2020-12-09T23:42:42Z")

</div>

> [@sam](#):
>
> 在极端负载下，对于“需要登录”的网站，我们所能做的最好的事就是显示一个蓝色屏幕，提示“网站负载过高，请稍后再试”。我们希望能再等一会儿，看看是否还有更多投诉，然后再添加此功能。

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

---

<div class="post-metadata">

**Author:** ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)\
**Post date:** [2020年十二月16日 01:42 UTC](https://meta.discourse.org/t/when-a-site-requires-login-do-not-show-site-is-overloaded-banner-there-is-no-anon-access/156688/11 "2020-12-16T01:42:32Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![codinghorror](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/codinghorror/32/110067_2.png) [@codinghorror](https://meta.discourse.org/u/codinghorror)\
**Post date:** [2021年三月10日 21:45 UTC](https://meta.discourse.org/t/when-a-site-requires-login-do-not-show-site-is-overloaded-banner-there-is-no-anon-access/156688/12 "2021-03-10T21:45:27Z")

</div>


