Kubernetesのクラスター上に別サービスでwordpressとmysqlを立てて通信する際、かなり詰まったので解決するために試したことを書いておきます。
WordPress側で発生するError establishing a database connection
を解決するための方法です。
##とりあえず確認したこと
###WordPress側の設定
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'wpdb' );
/** MySQL database username */
define( 'DB_USER', 'wpuser' );
/** MySQL database password */
define( 'DB_PASSWORD', 'wppass' );
wp-config.php
のDB_NAME
, DB_USER
, DB_PASSWORD
がmariaDB側と合っているか確認しました。
###mariaDB側の設定
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| wpdb |
+--------------------+
MariaDB [(none)]> select user, host from mysql.user;
+-------------+--------------+
| User | Host |
+-------------+--------------+
| | bbcec86f632b |
| | localhost |
| mariadb.sys | localhost |
| mysql | localhost |
| root | localhost |
| wpuser | localhost |
+-------------+--------------+
wp-config.phpで設定しているデータベース, ユーザーが存在しているか確認しました。
show grants for 'ユーザー'@'ホスト'
作成したユーザーが作成したデータベースに対する権限を持っているかの確認も行いました。
##別コンテナの時確認したこと
###wordpress側の設定
/** MySQL hostname */
define( 'DB_HOST', 'mysql' );
私は別サービスでmariadb
とwordpress
を構築していたので、デフォルトのlocalhost
だと接続できませんでした。
サービス名で名前解決できるのでサービス名に設定しました。
curl
等でリクエストを飛ばし、名前解決が正常に動作しているか確認する必要があるかもしれません。
###mariaDB側の設定
コンフィグの確認
公式サイトを見ながら、作成したuserにアクセスできるよう設定を行いました。
[mysqld]
user = root
datadir = /var/lib/mysql/
skip-networking = 0
skip-bind-address
my.cnfというファイルにこのような内容を保存し、/etc
に配置しました。
mysql --help | find "my.cnf"
検索を行い、デフォルトのコンフィグを書き換えても動作すると思います。
###DBに作成したユーザーのホスト
mariadbに追加したwordpress用のユーザーを別サービスから触るためには、適切な権限が設定されていなければなりません。
'ユーザー名'@'WP側のIP'
または
'ユーザー名'@'%'
ワイルドカード指定なるのですべてのホストから接続可能
私が接続できなかった原因はこれでした。
'ユーザー名'@'localhost'
以前作成したDockerfileからコピペしてきていたため、localhostになったままなのでMariadbに接続できず、wordpressが機能しませんでした。
##まとめ
やっと会えました。