스플래시 화면이 하드 리프레시 전까지 멈춰 있습니다

가끔 제가 운영하는 포럼에서 로딩이 끝없이 계속되는 스플래시 화면이 표시되는 경우가 있습니다.

재빌드 이후나 포럼을 오랫동안 방문하지 않은 후에 발생하는 것 같습니다. 브라우저 종류나 포럼 플러그인과는 관련이 없어 보입니다. 그리고 일부 사용자에게는 발생하지만 다른 사용자에게는 발생하지 않습니다.

강제 새로 고침(Windows의 경우 Ctrl-F5, Mac의 경우 Cmd-Shift-R)을 하면 항상 해결되는 것 같습니다. CDN의 캐싱 문제일 것 같지만 확신은 하지 못합니다. 비슷한 현상을 겪고 계신 분 있으신가요?

페이지가 로딩되지 않을 때의 콘솔

강제 새로 고침 후의 콘솔

이러한 모든 오류는 요청이 속도 제한(rate limiting)을 받아 발생하는 것입니다. Discourse는 에셋을 로드할 수 없으면 실행할 수 없습니다.

다음 사항들을 확인해 보세요.

  • 백엔드로 올바른 최종 사용자 IP 주소가 전달되고 있나요?
  • 속도 제한이 올바르게 설정되어 있나요? (일반적으로)
  • 여기서 속도 제한을 수행하는 엔티티는 무엇인가요?

해당 서버에는 모든 사용자 트래픽을 단일 IP 뒤에 숨기는 리버스 프록시가 없습니다. Discourse 내부에서 설정된 레이트 리밋은 기본값입니다.

CDN이 프록싱을 수행하고 있을 수도 있겠습니다. 백엔드로 최종 사용자 IP가 전달되고 있는지 확인할 수 있는 권장 방법이 있을까요? 로그에서 요청이 너무 많다는 메시지는 확인되지 않습니다.

이것은 문자 그대로 CDN의 역할이므로, 요청 체인에서 올바른 최종 사용자 IP가 유지되도록 확인해야 합니다.

아마도 그렇게 하지 않으셨을 가능성이 높으며, CDN POP의 요청 속도 제한에 대해 최종 사용자의 요청이 집계되고 있을 것입니다.

image

여기서 CDN이 429를 반환하는 것을 볼 수 있지만, 해당 오류를 반환하는 결정을 내리는 주체(즉, 프록시인지 실제 서버인지)를 파악하기 위해 특정 설정을 조사해야 합니다.

해당 CDN은 KeyCDN입니다. OriginShield를 활성화하고 app.yml에 cloudflare.template.yml 스타일의 template.yml 파일을 추가해 보았지만, 여전히 429 오류가 발생했습니다.

더 이상 이것저것 시도해 보지 않고 BunnyCDN으로 전환했는데, 훨씬 잘 동작하는 것 같습니다.

혹시 다른 분들에게 도움이 될 수 있을까 하여 템플릿 파일을 아래에 첨부합니다.

keycdn.template.yml
run:
  - file:
      path: /tmp/add-keycdn-ips
      chmod: +x
      contents: |
        #!/bin/bash -e
        # Add list of keycdn ips
        curl -s 'https://www.keycdn.com/shield-prefixes.json' | \
          python3 -c "import sys, json; print('\n'.join(json.load(sys.stdin)['prefixes']))" > /tmp/keycdn-ips

        # Make into nginx commands and escape for inclusion into sed append command
        CONTENTS=$(</tmp/keycdn-ips sed 's/^/set_real_ip_from /' | sed 's/$/;/' | tr '\n' '\\' | sed 's/\\/\\n/g')
        
        echo keycdn IPs:
        echo $(echo | sed "/^/a $CONTENTS")
        # Insert into discourse.conf
        sed -i "/sendfile on;/a $CONTENTS\nreal_ip_header X-Forwarded-For;\nreal_ip_recursive on;" /etc/nginx/conf.d/discourse.conf
        # Clean up
        rm /tmp/keycdn-ips

  - exec: "/tmp/add-keycdn-ips"
  - exec: "rm /tmp/add-keycdn-ips"