前書き+前提条件
下記構成のMySQLに外部ホストからPHPで接続しようとしたところ、エラーが発生して接続が出来ませんでした。
LAMP環境 | version |
---|---|
L SentOS7 | 7.2.1511 |
A Apache | 2.4.6 |
M MySQL | 5.7.15 |
P PHP | 5.6.25 |
phpMyAdminからは接続できるのになぜ接続できないのだろうと試行錯誤したのでまとめます。
エラー発生
次のコードを書いてMySQLの接続テストをしたところ、エラーが発生しました。
1
2
3
4
5
6
7
8
9
10
11
12
|
<?php
$USER = "ユーザ名";
$PW = "パスワード";
$dns = "mysql:dbname=データベース名;host=ホスト名;charset=utf8";
try {
$pdo = new PDO ( $dns, $USER, $PW );
echo "success";
} catch ( Exception $e ) {
echo $e->getMessage ();
}
?>
|
エラー内容
SQLSTATE[HY000] [2002] 接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。
phpMyAdminからは接続できるのになぜだろうと思い、今度はコマンドラインから接続テストをしたところやはりエラーが発生。
エラー内容
ERROR 2003 (HY000): Can’t connect to MySQL server on ‘ホスト名’ (10060 “Unknown error”)
試行錯誤
外部ホストからでもphpMyAdmin経由で接続できるので、ユーザの設定は問題なさそうです。
また、MySQLが使用するポート(3306)が閉じていないか念の為確認しましたが大丈夫でした。
#netstat -tlpn
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp6 0 0 :::3306 :::* LISTEN ####/mysqld
となると、ファイアウォールの設定かな?と思いファイアウォールを停止したところ、外部ホストからのMySQL接続に成功しました。
#systemctl stop firewalld ←ファイアウォール停止
接続できない原因がファイアウォールの設定だと分かったので、
ファイアウォールを起動し、設定を行いました。
#systemctl start firewalld ←ファイアウォール起動
#firewall-cmd –add-service=mysql –zone=public –permanent ←MyAQLを設定
#firewall-cmd –list-services –zone=public –permanent ←サービスの一覧を表示し、mysqlがある事を確認
#firewall-cmd –reload ←設定反映
後書き
私の環境ではファイアウォールの設定だけで接続できるようになりました。
MySQL関連の設定はこの記事の他にも過去の記事で紹介しているので参考にしていただければ幸いです。