
WordPressを自前で構築する場合にMySQLの接続がうまくいかないことはよくある事象です。今回は、MySQLとの接続で「ERROR 2003 (HY000): Can’t connect to MySQL server」というエラーが発生した場合の対処法を紹介します。
見出し
はじめに
この記事に辿り着いているということは、MySQLの設定を終えたつもりで、外部のホストからMySQLのサーバ(X.X.X.X)にログインしようとした時に以下のエラーが出たのではないでしょうか。
$ mysql -h X.X.X.X -P 3306 -u wordpress -p
Enter password:
ERROR 2003 (HY000): Can't connect to MySQL server on 'X.X.X.X' (111)
今回はAWS上に、WordPress用のEC2インスタンスとMySQL用のEC2インスタンスを構築した前提で、「ERROR 2003 (HY000): Can’t connect to MySQL server」エラーが発生した場合の対処法を紹介します。
対処法
考えられる原因は複数あるので、原因を一つ一つ潰す形で対処しましょう。
EC2のSecurity Groupの設定に問題は無いか?(AWS限定の問題)
EC2インスタンスはSecurity Group(仮想的なファイアーウォール)によって接続可能なIPおよびポートを許可しています。サーバーの構成にもよるのですが、WordPress用のEC2インスタンスからMySQLのEC2インスタンスにポート3306で接続したいとすると、MySQL用のEC2インスタンスのSecurity GroupのInboundの設定で、WordPress用のEC2インスタンスのIPからTCPの3306ポートの接続を許可してある必要があります。
以下はTCPの3306ポートを全てのIPに対して許可する場合のInboundの設定です。
MySQLに慣れており、EC2に慣れていない人は、だいたいSecurity Groupの設定ミスが原因です。確認してみましょう。
EC2内のファイアーウォールの設定に問題は無いか?
単にAWSが提供しているイメージからEC2インスタンスを作っただけの場合は関係ありませんが、その後に自前でiptablesなどでファイアーウォールを設定した場合は、それが原因の可能性があります。設定を見直しましょう。
MySQLのポートは正しいか?
MySQLのデフォルトのポートは3306ですが、変更した覚えがあればそれが原因の可能性があります。以下のように確認してみましょう。
mysql> show variables like 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port | 3306 |
+---------------+-------+
3306を想定しており、上記のように一致してればOKです。
MySQLに接続できるホスト設定に問題は無いか?
仮にwordpressというユーザを作ったとして、そのユーザがどのホストから接続できるようになっているかを確認しましょう。デフォルトでは「localhost」(ループバックアドレスなので同じホスト内のみ接続可能)となっているので、変更した覚えがなければそれが原因です。
mysql> select user, host from mysql.user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| wordpress | % |
| debian-sys-maint | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
「wordpress@”%”」の設定となっている場合は、全てのホストからwordpressユーザで接続できます。
MySQLの設定ファイルに問題は無いか?
「/etc/mysql/mysql.conf.d/mysqld.cnf」ファイルのbind-addressも確認しましょう。デフォルトでは「127.0.0.1」(ループバックアドレスなので同じホスト内のみ接続可能)となっているので、接続したいホストに応じてに変更する必要があります。例えば「0.0.0.0」に設定すれば全てのホストからの接続を許可できます。
$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
...
#bind-address = 127.0.0.1
bind-address = 0.0.0.0
...
ここまでくればエラーは解決したはずです。
おまけ
外部ホストからのMySQLの接続が成功したとして、WordPressの画面を表示しようとした場合に「Error establishing a database connection」というエラーが発生している場合があります。
このエラーの意味はWordPressとMySQLとの接続に問題があるという意味ですが、この記事で解決したエラーがなくなっている状態で発生している場合は原因はおそらく一つです。WordPressのDB_HOSTの設定を見直しましょう。
$ vi /var/www/wordpress/wp-config.php
...
define('DB_HOST', 'X.X.X.X');
...
今回の場合は、明示的にMySQL用のEC2インスタンスのプライベートIPを指定してあげる必要があります。
最後に
いかがでしたか?これでMySQLの接続問題は解決できたことでしょう。また、AWSを使っていなくても、AWS以外の部分はそのまま解決策になると思いますので、検索してこの記事にたどり着いた人は試して見て下さい。それでは。

