Cloudflare かプラグインが Discourse インスタンスを破損させていますか?

Discourseフォーラムで通知のベルアイコンをクリックすると、ローダーが表示されたままになります。ローダーメニューには「Slow down, too Many Requests from this IP Address(IPアドレスからの要求が多すぎます。少し待ってください)」と表示されています。Cloudflareを使用しています。

「いいね!」 2

具体的に、Cloudflare をどのように利用されていますか?

ここには非常に関連性の高いトピックがあります:

そこに記載されている 3 つのステップを実行されましたか?

「いいね!」 1

はい、従いました。最近のベータ版アップデートまでは正常に動作していました。
現在も大部分は問題なく動作しています。ただし、通知が問題を引き起こしており、数秒ごとに無限にリクエストを送信してしまいます。

また、こちらが私のコンソールです。

そして、こちらが開いているファイルです。

「いいね!」 2

Cloudflareを無効にしてください。サイトが破損しています。

「いいね!」 2

私は Cloudflare の無料プランを利用しており、5ドルのサブスクリプションの Cloudflare SSL を使用しています。Rocket Loader はオフになっており、ミニフィケーションなどの他の最適化機能もすべて無効化されています。Railgun などの他の機能は無料プランでは利用できません。キャッシュは既存のオリジンヘッダーを尊重するように設定されています。以前は正常に動作していましたが、/admin/upgrade にアクセスして master git ブランチにアップグレードしたことが原因で問題が発生した可能性があります。その後、スクリプトや言及を削除しましたが、通知のチェックが繰り返し行われています。問題は通知のみに限定されており、他の機能は正常に動作しています。

私は Cloudflare を使用して Amazon S3 に保存されたファイルを CloudFront 経由で配信しています。Cloudflare を使用しないとコストが上昇します。Cloudflare は DNS と SSL プロバイダーとしての役割のみを果たしており、その最適化機能や機能の多くは無効化されており、無料プランでは利用できないものもあります。私の状況において、Cloudflare が依然として原因であると思われますか?

問題を解決するために再構築を試みるべきでしょうか?

追伸:私は StackOverflow、CodingHorror Blog、そして Discourse のファンです。敬意を表して :vulcan_salute:

「いいね!」 1

まずは、CloudFlare(基本的な DNS を除く)を無効にしてみることをお勧めします。これで問題が解消されれば、原因が特定できます。

「いいね!」 1

Cloudflare のオレンジクラウドを無効にし、ブラウザが Cloudflare ではなく Let’s Encrypt の SSL を表示するのを待って、コンテンツが Cloudflare を通さずに直接サーバーからアクセスされていることを確認しました。その後、ビルドを再実行しましたが、ユーザーメニューや通知アイコンをクリックしても、以下のエラーが発生します。

Uncaught (in promise) DOMException: Quota exceeded.
_application-977ce16935600e0a620c1ea565154ab68e46f60a9fe0f207139e0f2128dd9474.js:77250 Uncaught TypeError: Cannot read property 'dasherize' of undefined
    at s.itemHtml (_application-977ce16935600e0a620c1ea565154ab68e46f60a9fe0f207139e0f2128dd9474.js:77250)
    at _application-977ce16935600e0a620c1ea565154ab68e46f60a9fe0f207139e0f2128dd9474.js:77390
    at _ember_jquery-d1d89874d5f08a664c68007c6c2eef5e3bb1cbd8058291fce7818d8ef4ded8ca.js:39008
    at t.u.Mixin.create.c.forEach (_ember_jquery-d1d89874d5f08a664c68007c6c2eef5e3bb1cbd8058291fce7818d8ef4ded8ca.js:38995)
    at t.u.Mixin.create.c.map (_ember_jquery-d1d89874d5f08a664c68007c6c2eef5e3bb1cbd8058291fce7818d8ef4ded8ca.js:39007)
    at s.html (_application-977ce16935600e0a620c1ea565154ab68e46f60a9fe0f207139e0f2128dd9474.js:77389)
    at s.value (_application-977ce16935600e0a620c1ea565154ab68e46f60a9fe0f207139e0f2128dd9474.js:80621)
    at s.value (_application-977ce16935600e0a620c1ea565154ab68e46f60a9fe0f207139e0f2128dd9474.js:80371)
    at s (_vendor-7fd29296ee54f8a7ced9508b106a09ec4aae4912ed1cf10eceb7eb2acca03309.js:20669)
    at t.exports (_vendor-7fd29296ee54f8a7ced9508b106a09ec4aae4912ed1cf10eceb7eb2acca03309.js:20652)

ファイルを開くと、以下のように表示されます。

define("discourse/widgets/quick-access-notifications", ["discourse/lib/ajax", "discourse/widgets/widget", "discourse/widgets/quick-access-panel"], function (_ajax, _widget, _quickAccessPanel) {
  "use strict";

  (0, _widget.createWidgetFrom)(_quickAccessPanel.default, "quick-access-notifications", {
    buildKey: function buildKey() {
      return "quick-access-notifications";
    },
    emptyStatePlaceholderItemKey: "notifications.empty",

    markReadRequest: function markReadRequest() {
      return (0, _ajax.ajax)("/notifications/mark-read", { type: "PUT" });
    },
    newItemsLoaded: function newItemsLoaded() {
      if (!this.currentUser.enforcedSecondFactor) {
        this.currentUser.set("unread_notifications", 0);
      }
    },
    itemHtml: function itemHtml(notification) {
      var notificationName = this.site.notificationLookup[notification.notification_type];

      return this.attach(notificationName.dasherize() + "-notification-item", notification, {}, { fallbackWidgetName: "default-notification-item" });
    },
    findNewItems: function findNewItems() {
      return this._findStaleItemsInStore().refresh();
    },
    showAllHref: function showAllHref() {
      return this.attrs.path + "/notifications";
    },
    hasUnread: function hasUnread() {
      return this.getItems().filterBy("read", false).length > 0;
    },
    _findStaleItemsInStore: function _findStaleItemsInStore() {
      return this.store.findStale("notification", {
        recent: true,
        silent: this.currentUser.enforcedSecondFactor,
        limit: this.estimateItemLimit()
      }, { cacheKey: "recent-notifications" });
    }
  });
});

気づいたのですが、この問題は管理者としてログインし、かつ mini_profiler が表示されている場合にのみ発生します。通常ユーザーとしてログインすると、期待通りに動作します。

「いいね!」 1

参照:

おそらく、ローカルストレージをすべてクリアしてみてください。

ストレージをクリアしたところ、クォータエラーは表示されなくなりました。しかし、複数のリクエストが引き続き発行され、429エラー(低速化を促す応答)が発生します。現在はCloudflareを使用していないのですが(app.ymlからCloudflareのテンプレートをコメントアウトすべきでしょうか?)、エラーはdasherizeにおいて同様です。これらのエラーは管理者ユーザーに対してのみ発生し、すぐにレート制限に達してしまいます。

非公式のプラグインやテーマを使用中ですか?そのいずれかが大量のリクエスト負荷を発生させている可能性があります。

以下のプラグインを使用しています

まず初めに、使用していないプラグインはすべてコメントアウトすることをお勧めします。インストール済みで無効化されていても、システムに負荷をかけます。

まずはサードパーティ製のプラグイン(緑色のチェックマークのないもの)をすべて無効にしてください。おそらく、問題の原因はそこにあるはずです。

Cloudflare を削除し、多くのプラグインやサードパーティ製プラグインも削除しましたが、問題は解決していません。

緑色のチェックマークが付いていないものをすべて削除し、再構築してください。

同じエラーが他のコンピューターでも発生するか確認してください。ディスク容量不足やその他のローカルな問題が原因である可能性があります。

「いいね!」 2

モバイルブラウザでは動作しています :slight_smile: 原因を探ります。ローカル環境での問題は何でしょうか?おそらくディスク容量と低速なディスクドライブに関連しているのでしょう。とにかく、不要なプラグインをいくつか削除できてよかったです :laughing:

「いいね!」 1

実は、一部のユーザーでまだこの問題に直面しています。

私の問題は、以下で言及されている問題に関連していると考えており、このバージョンにアップグレード後にこの問題が発生しています。

この問題の原因が何なのか特定できていません。新規ユーザーでは機能するものの、他のユーザーでは機能しません。以前は Discourse Follow プラグインを使用していたのですが、それをコメントアウトしました。すると、この問題が発生するようになりました。もしかすると、そのプラグインを削除したことが原因でこの問題が起きているのでしょうか?おそらく、そのプラグインを使用していたか、フォロワーがいたユーザーで発生しているのではないかと推測しています。実はかなり飛躍した仮説ですが、このプラグインが原因である可能性はありますか?

はい、その可能性はあります。そのプラグインは当社のものではないため、それが原因かどうかはわかりません。再度プラグインを有効にして確認してみてください。問題が解決すれば、そのプラグインのトピックで報告してください。

「いいね!」 2

@Falco はい、これでこの問題は解決しました。discourse-follow プラグインを再度追加したところ、問題が解消しました。ありがとうございます :slight_smile:

「いいね!」 3