DC SSO接続の失敗によるタイムアウトで管理画面が遅延

Discourse Connect SSO を公式プラグインを使用して設定しました。これにより、WP ユーザーはそこで別のユーザーを登録することなく Discourse にログインできます。すべて正常に機能していますが、Query Monitor プラグインを通じてのみ発見したタイムアウトにより、すべての WP ダッシュボード(管理画面)リクエストが 10 秒遅延しています。

https://{our-forum-address}/site.json cURL error 28: Connection timeout after 10001 ms

WPDiscourse\Admin\MetaBox->discourse_request()
wp-content/plugins/wp-discourse/lib/plugin-utilities.php:516
WPDiscourse\Admin\MetaBox->get_discourse_categories()
wp-content/plugins/wp-discourse/lib/plugin-utilities.php:273
WPDiscourse\Admin\MetaBox->setup_options()
wp-content/plugins/wp-discourse/admin/meta-box.php:49
do_action(‘admin_init’)
wp-includes/plugin.php:517

プラグイン: wp-discourse

機能していたとしても、なぜこのような呼び出しが必要なのですか?無効にするにはどうすればよいですか?

フォーラムとサイトは別々のサーバーにあります。Cloudflare はありません。SSL は letsencrypt です。ステージングではこの問題はありませんでした。本番環境に移行し、新しい API キーとシークレットを作成してこれを解決しようとしましたが、うまくいきませんでした。

プラグインには「Discourse に接続されていません。接続設定が正しいことを確認してください。問題が解決しない場合は、接続ログを有効にしてログを確認してください。」と表示されますが、ユーザーはフォーラムのアドレスを含むリンクをクリックするだけでシームレスにフォーラムにログインできるため、接続されています。

WP のログには次のように表示されます。

[2024-10-31 10:54:47] connection.INFO: check_connection_status.failed_to_connect {"error":"wpdc_response_error","message":"An invalid response was returned from Discourse","http_code":"","http_body":""}

奇妙な WP のセキュリティ機能がそれを無効にしていると考えたため、これを追加しましたが、効果はありませんでした。

add_filter('http_request_host_is_external', [$this, 'mark_discourse_api_url_external'], 10, 3);

function mark_discourse_api_url_external($is_external, $host, $url)
{
    if ($host === "{our-forum-address}") {
        return true; // ホストが外部であることを示してリクエストを許可する
    }

    return $is_external;
}

こんにちは @Firsh さん

/site.json への呼び出しは、WordPress プラグインが Discourse に関する情報を取得するために必要です。

これは、正しく接続されていないことを意味します。すべてが機能しているように見えても、機能し続けるとは限りません。

ここに焦点を当てる必要があります。どのような種類のキーを作成したか教えていただけますか?参考までに、こちらの手順に従っていることを確認してください。

「いいね!」 2

キーではないと思います。以前はステージングサイトのキーで試しましたが、新しいキーは「未使用」と表示されます。フォーラムのホームページへのテストコール wp_remote_request を試すと、それもタイムアウトします。私は「すべてのユーザー」と「グローバル」で設定しました。

ええ、でもなぜ関係のないすべての管理ページで常にそうなるのでしょうか?必要なときに一度だけで十分です。どこから来ているのかを突き止めましたが、それは function get_discourse_categories() であり、これは add_action( 'admin_init', array( $this, 'setup_options' ) ); にハードコードされています。フォーラムのカテゴリをWordPressに知られたくありません。公開/コメント機能は使用しておらず、ログイン機能だけが必要で、それはすでに機能しています。

また、wp_remote_request() を使用してフォーラムのホームページにリクエストしましたが、それもタイムアウトします。他のランダムなサイトにはアクセスできます。

/site.jsonへのリクエストは不要だとお感じのことと存じますが、Discourseへの正常な接続なしでは、Wordpressプラグインが確実に機能しないため、いずれにしてもその原因を突き止める必要があります。

  1. ステージング環境と本番環境の間で、他に違いは考えられますか?
  2. ステージング環境と本番環境のWP Discourseログメタファイルをご共有いただけますか?
  3. WordpressとDiscourseのインスタンスへのリンクをご共有いただけますか?
「いいね!」 1

はい、しかしそれはハンガリー語の会員限定サイトとフォーラムです。

フォーラム: https://forum.intelligensbefektetok.hu/
サイト: https://intelligensbefektetok.hu/

私のステージング環境は手動で正確にコピーしたものですが、VM内のDockerで実行されています。本番環境は私が管理しておらず、どのようなホスティングなのか全く分かりませんが、これまで問題はなく、以前はかなり高速でした。

試したこと:

  • discourse_request 関数内の sslverify = false オプション
  • Cloudflareで別のドメインにCNAME(エイリアス)を作成し、舞台裏でフォーラムのホストを指すようにしました(「より良い」SSLで、ホストは異なります。これにより、ライブサイトのホストのファイアウォールにおけるループバック制限のようなものを除外できます)。https://ibkforum.stateofbliss.us ですが、ステージングからのリクエストテストは問題なく動作するにもかかわらず、同様にタイムアウトします。ログインしていない場合はメインサイトにリダイレクトされます。
  • この小さなプラグインを使用してリクエストをチェックしています: https://wphive.com/plugins/wp-remote-request-check/
object(WP_Error)#5757 (3) { ["errors"]=> array(1) { ["http_request_failed"]=> array(1) { [0]=> string(59) "cURL error 28: Connection timed out after 5000 milliseconds" } } ["error_data"]=> array(0) { } ["additional_data":protected]=> array(0) { } }
  • 他のWordPressサイト、このフォーラム、自身にリクエストを送信しているライブサイトはすべて正常に動作します。

ステージング環境のWordPressログ:

[2024-10-31 13:09:08] connection.INFO: check_connection_status.valid_scopes
[2024-10-31 13:09:19] connection.INFO: check_connection_status.successful_connection
[2024-10-31 13:09:19] connection.INFO: check_connection_status.valid_scopes

本番サイトのログはOPと同じです:

[2024-10-31 13:12:32] connection.INFO: check_connection_status.failed_to_connect {"error":"wpdc_response_error","message":"An invalid response was returned from Discourse","http_code":"","http_body":""}

ブラウザで直接読み込むと、これは動作します:
https://forum.intelligensbefektetok.hu/site.json

ちなみに、助けてくれてありがとう。

WordPressの本番環境、またはDiscourseの本番環境のことでしょうか? Discourseの本番環境で、リクエストのリダイレクトやヘッダーの変更(または削除)を行っているものはありますか?

両方のインスタンスのメタファイルを共有していただけると助かります。「ログ」管理パネルの「メタを表示」をクリックしてください。

これが根本的な問題でしょう。WordPressがDiscourseを全く見ることができない場合、接続は機能しません。この接続性を簡単にテストできるのであれば、フォーラムのネットワークレイヤーに何か変更を加えながら、403(つまり未承認)になるまでテストを続けることをお勧めします。

ネットワークレイヤーの問題、おそらくリダイレクトやファイアウォールが原因だと考えられます。

ステージングのDiscourseはなく、両方のサイトで同じライブDiscourse(同じユーザーIDなど)を使用しています。別のスレッドでこれについて質問しましたが、問題ないはずです。フォーラムのネットワークレイヤーは非常にシンプルで、Hetznerでホストされており、VPSに公式のDockerを使用しています。フォーラムはほとんど使用されておらず、ビジュアル以外のカスタマイズもほとんど行われていません。到達できないようにする設定は認識していません。接続が失敗する理由を確認するために、WPホスティング会社にチケットを作成しました。彼らの異常なセットアップについてより心配しているからです。

興味深いのは、フォーラムがWPに到達できる(その逆ではない)という事実だけで、機能するSSOには「十分」であるということです。フォーラムからのユーザーのログアウトを除いて。

ログ(ライブサイトは0バイトのZIPをダウンロードします)。

ええ、まずはその結果を待つのが良いでしょう。そうでなければ、ここで無駄骨を折ることになるかもしれません。基本的な疑問は、標準的なWPリクエストがなぜあなたのフォーラムに到達できないのかということです。