로그인이 필요한 사이트에서 '사이트가 과부하 상태입니다' 배너를 표시하지 마세요. 비로그인 접근이 불가능합니다.

가끔 우리 포럼 상단에 다음과 같은 알림이 표시됩니다:

극심한 부하로 인해, 현재는 로그아웃된 사용자가 보는 것과 동일한 화면이 임시로 표시됩니다.

이 알림에 대해 몇 가지 관찰 사항과 질문이 있습니다:

첫째, 서버가 실제로 극심한 부하 상태에 있는 것 같지 않습니다. 이 경고가 마지막으로 표시되었을 때, 서버 모니터링을 확인해 보니 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가 요청을 유니콘(애플리케이션 서버)으로 전달했을 때 큰 지연이 감지되면 표시됩니다.

예를 들어(과장해서 말하자면):

  • NGINX가 … 1시에 사용자로부터 받은 요청을 전달합니다.
  • 1시간이 경과합니다.
  • 애플리케이션 서버가 요청을 받으면 … 어머, 이 요청을 받기까지 1시간이나 걸렸네요… 제가 과부하 상태인 것이 분명합니다.

다음 두 설정으로 임계값을 제어할 수 있습니다:

DISCOURSE_FORCE_ANONYMOUS_MIN_QUEUE_SECONDS와 DISCOURSE_FORCE_ANONYMOUS_MIN_PER_10_SECONDS

가장 중요한 것은 서버에 여분 용량이 많다면 UNICORN_WORKERS를 늘려 유니콘 프로세스를 추가하는 것입니다.

사이트에 로그인 요구 사항이 있다면, 경고를 더 심각한 수준(예: 블루 스크린, 레이트 리밋 적용됨)으로 변경해야 할 것 같습니다.

로그인이 필요한 사이트에서 이 레이트 리밋에 걸린 사례는 처음 들어봅니다. 이 부분에서 더 나은 처리가 필요하다는 데 동의합니다.

4개의 좋아요

독립적인 불만 1건이 더 들어오기를 여기서 기다릴 예정입니다.

극단적인 부하 상황에서 “로그인 필요” 사이트에 대해 우리가 할 수 있는 최선은 "사이트가 과부하 상태입니다. 나중에 다시 시도해 주세요"라는 푸른 화면을 표시하는 것입니다. 이 기능을 추가하기 전에 조금 더 기다려보고 불만 1건을 더 확인해 보고 싶습니다.

3개의 좋아요

자주 방문하는 작은 개인 Discourse 커뮤니티에서 이런 일이 발생했습니다. 처음에는 nginx 502 bad gateway 오류가 발생했고, 이후에는 아예 로드가 되지 않았습니다. 결국 로드는 되었는데, 앞서 언급한 배너 메시지가 표시되었습니다.

1개의 좋아요

지금 이 기능을 추가해도 안전하다고 생각합니다. 로그인 필요 사이트가 과부하 상태라면, 더 많은 사용자를 추가하는 것이 그들에게 도움이 되지 않으므로요.

3개의 좋아요

네… 다음 릴리스에 포함하겠습니다

3개의 좋아요