Экран загрузки завис, пока не сделать жесткую перезагрузку

Иногда я вижу, что управляемые мной форумы показывают загрузочный экран, который никогда не перестает загружаться.

Похоже, это происходит после перестроения или если я долго не заходил на форум. Это, кажется, не связано с разными браузерами или плагинами форума. И это случается с некоторыми людьми, но не со всеми.

Жесткая перезагрузка (Ctrl-F5 в Windows или Cmd-Shift-R на Mac) кажется исправляет это каждый раз. Я предполагаю, что это проблема кэширования с CDN, но я не уверен. Кто-нибудь еще сталкивается с чем-то подобным?

Консоль, когда страница не загружается

Консоль после жесткой перезагрузки

Каждая из этих ошибок вызвана ограничением частоты запросов. Discourse не может работать, если его ресурсы не загружаются.

Вам следует проверить:

  • передаётся ли правильный IP-адрес конечного пользователя на бэкенд?
  • корректно ли настроено ограничение частоты запросов? (в общем случае)
  • какое именно сущность осуществляет ограничение частоты запросов в данном случае?

Что касается этого сервера, обратного прокси, который скрывал бы весь пользовательский трафик за одним IP-адресом, нет. Ограничения скорости, установленные в Discourse, являются значениями по умолчанию.

Возможно, CDN выполняет какое-то проксирование? Есть ли рекомендуемый способ убедиться, что IP-адреса конечных пользователей передаются на бэкенд? В логах я не вижу ничего о слишком большом количестве запросов.

Это буквально задача CDN, поэтому да, вам необходимо убедиться, что правильный IP-адрес конечного пользователя сохраняется на протяжении всей цепочки запросов.

Полагаю, вы этого не сделали, и все запросы от CDN учитываются в рамках лимита скорости запросов для POP-узлов CDN, а не для конечных пользователей.

image

Здесь видно, что CDN возвращает ошибку 429, но вам нужно изучить вашу конкретную конфигурацию, чтобы определить, кто принимает решение о возврате этой ошибки (то есть прокси или реальный сервер).

Речь идет о CDN KeyCDN. Я попытался включить OriginShield и добавить файл template.yml (по образцу cloudflare.template.yml) в свой app.yml, но всё равно получал ошибки 429.

Вместо того чтобы продолжать возиться с этим, я перешёл на BunnyCDN, и это, кажется, работает лучше.

Ниже привожу файл шаблона на случай, если он поможет кому-то ещё.

keycdn.template.yml
run:
  - file:
      path: /tmp/add-keycdn-ips
      chmod: +x
      contents: |
        #!/bin/bash -e
        # Добавить список IP-адресов KeyCDN
        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

        # Преобразовать в команды nginx и экранировать для включения в команду sed append
        CONTENTS=$(</tmp/keycdn-ips sed 's/^/set_real_ip_from /' | sed 's/$/;/' | tr '\n' '\\' | sed 's/\\/\\n/g')
        
        echo IP-адреса KeyCDN:
        echo $(echo | sed "/^/a $CONTENTS")
        # Вставить в discourse.conf
        sed -i "/sendfile on;/a $CONTENTS\nreal_ip_header X-Forwarded-For;\nreal_ip_recursive on;" /etc/nginx/conf.d/discourse.conf
        # Очистка
        rm /tmp/keycdn-ips

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