👻

TiDB x Wordpress x Conohaで死ぬほどハマった話

2024/01/06に公開

備忘録

今回やりたかったのは、wordpressを立ち上げてRDBをTiDBに向けるという作業ですがそれぞれがそれぞれハマりどころがあったので適当に備忘録を残しておきます

超疲れたので書きなぐりです。色々自己責任で

Conoha

1. セキュリティグループの罠

こんなかんじで指定する必要がある
defaultだけでも、defaultを消しても繋がらなくなる気がするので注意

2. conoha wing / kusanagiの罠

conoha wingはそもそもカスタマイズ性が低くてだめでした(やる方法もあるのかもしれないけどしんどそうなのでSKIP)

VPSでkusanagi(画像参照)を使ってサクッとインストールすると、黒魔術的な内部構造から来る不明なバグが大量に発生したり、https化したら無限にリダイレクトループが発生してダメでした

↓ここらへん

結局Ubuntuだけインストールして自分で全部環境用意しました

3. ufwの罠

これは自分が知らなかっただけでデフォルトの挙動かもしれないですが結構ハマりました

80ポートの通信を通すために 1.でセキュリティグループを設定してもサーバー側でufwが動いていると遮断されるのでufwの設定を確認して必要なポートを開けましょう

$ ufw status

挙動としてはこんな感じだったのでどこでつまってるか調べてみてください

  • 接続が拒否される=1.のセキュリティグループ
  • 接続がタイムアウトされる = 3.のufw

wordpress x TiDB

1. DB設定時に文字コード問題

[Unsupported collation when new collation us enabled: 'utf8mb4_unicode_520_ci']

こんなエラーが発生しますが下のブログを参考にコメントアウトで対応

https://tech.synapse.jp/entry/2023/08/30/160000

2. wp-configにsslの設定を追加

以下をdefine( 'DB_COLLATE', '' );の下辺りに追加するとグッドです

define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
define('MYSQL_SSL_CA', '/etc/ssl/certs/ca-certificates.crt');

3. wp-adminで投稿一覧が表示されない

すべて(3)とかなっている&TiDB側には記事が保存されているけど「投稿が見つかりませんでした。」と表示される問題

wp-config.phpからデバッグをONにして確認すると以下のエラーが確認できる

WordPress データベースエラー: [function SQL_CALC_FOUND_ROWS has only noop implementation in tidb now, use tidb_enable_noop_functions to enable these functions]
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND ((wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'future' OR wp_posts.post_status = 'draft' OR wp_posts.post_status = 'pending' OR wp_posts.post_status = 'private'))) ORDER BY wp_posts.post_date DESC LIMIT 0, 20

このプラグインを使えば解決らしい

https://github.com/pingcap/wordpress-tidb-plugin/tree/main

chatgptさんに使い方を聞いたので貼っておきます(この通りにやれば動きました)


提供されたコードは、WordPress 用のカスタムプラグインとして機能するように設計されています。このコードをWordPressに追加するには、新しいプラグインを作成するのが最適な方法です。以下に、その手順を説明します。

新しいプラグインファイルの作成:

WordPress インストールの wp-content/plugins ディレクトリに移動します。
新しい PHP ファイルを作成します。例えば、tidb-compatibility.php という名前でファイルを作成できます。

提供されたコードの追加:

https://github.com/pingcap/wordpress-tidb-plugin/blob/main/tidb-compatibility/tidb-compatibility.php

作成した tidb-compatibility.php ファイルを開き、提供されたコードをこのファイルにコピー&ペーストします。
プラグインのアクティベーション:

WordPress 管理画面にログインします。
「プラグイン」セクションに移動し、新しく追加した「TiDB Compatibility」プラグインを見つけます。
このプラグインをアクティベートします。
このプラグインは、WordPress の WP_Query クラスにフックを追加して、SQL_CALC_FOUND_ROWS を使用するクエリを修正します。これにより、TiDB でのクエリのパフォーマンス問題が解決する可能性があります。

注意事項
このプラグインはカスタムコードを含んでいるため、WordPress のアップデート時には影響を受けませんが、サイトの機能に影響を与える可能性があります。プラグインをアクティベートする前に、サイトのバックアップを取ることをお勧めします。
カスタムプラグインの開発やメンテナンスには、PHPとWordPressの開発に関する基本的な知識が必要です。不明な点があれば、専門家の助けを求めることを検討してください。

4. https化した時にadminが無限リダイレクトされる

wp-config.php のどこかに以下を追加

対応があってるのかわからないですがとりあえず動いてるのでヨシ!

define('FORCE_SSL_ADMIN', true);
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'){
        $_SERVER['HTTPS']='on';
}

ググっても情報がほとんどなかったので備忘録として残しておきます
正確性とかセキュリティとか必要なあれこれは各自でお願いします

Discussion