データベース接続にPHPを使用する場合の一般的な間違いの1つ、特にmysqli_connect()またはPDOを使用してデータベースに接続する場合は次のとおりです。
Host 'xxx.xxx.xxx.xxx' is not allowed to connect to this MySQL server
このエラーメッセージは、主にデータベースサーバーの許可構成でクライアントIPアドレスが接続できないため、データベースサーバーが現在のクライアントホストからの接続要求を拒否することを意味します。
この記事では、この問題のトラブルシューティングと解決方法について詳しく説明します。
MySQLサーバーを使用すると、ユーザーが接続できる場合、ユーザー名とパスワードを検証するだけでなく、接続が発生するホストアドレスを検証します。つまり、ユーザー名とパスワードが正しい場合でも、接続ホストが承認されていない場合は拒否されます。
デフォルトでは、MySQLはLocalHost (ネイティブ)接続のみを許可し、リモート接続には追加の構成が必要です。
接続時にどのホスト名またはIPが渡されますか?通常、このようなPHPコードで書かれています:
$mysqli = new mysqli('db.m66.net', 'user', 'password', 'database');
ここのホスト名がデータベースサーバーの正しいIPまたはドメイン名であることを確認してください。
「ホストが接続できない」問題を解決するには、MySQLサーバーで指定されたクライアントホストを承認する必要があります。
データベースのユーザー名がdbuserであると仮定すると、リモートホストIP 123.123.123.123からの接続を許可する必要があります。
GRANT ALL PRIVILEGES ON database.* TO 'dbuser'@'123.123.123.123' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
すべてのホスト接続を許可する場合(生産環境には推奨されません)、 % WildCard文字を使用できます。
GRANT ALL PRIVILEGES ON database.* TO 'dbuser'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
MySQLはデフォルトでは127.0.0.1にバインドされており、ネイティブアクセスのみが制限されています。
mysql構成ファイル(通常/etc/mysql/my.cnfまたは/etc/mysql/mysql.conf.d/mysqld.cnf )を開き、次の行を見つけます。
bind-address = 127.0.0.1
に変更してください:
bind-address = 0.0.0.0
次に、MySQLサービスを再起動します。
sudo service mysql restart
サーバーファイアウォールにより、MySQLデフォルトポート3306への外部アクセスが可能になります。
たとえば、 UFWを使用してください。
sudo ufw allow 3306/tcp
データベースサーバーアドレスがdb.m66.netであると仮定すると、接続コードの例:
<?php
$host = 'db.m66.net';
$user = 'dbuser';
$password = 'password';
$dbname = 'database';
$mysqli = new mysqli($host, $user, $password, $dbname);
if ($mysqli->connect_error) {
die('接続に失敗しました: (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}
echo '接続に正常に!';
$mysqli->close();
?>
ユーザー名とパスワードが正しいことを確認してください。
PHPおよびMySQLサーバーネットワークが相互運用可能であることを確認し、 PingまたはTelnet DB.M66.NET 3306を使用してテストできます。
データベースユーザーのアクセス許可を確認して、ユーザーが指定されたデータベースにアクセスする許可があることを確認します。
詳細については、MySQLエラーログを確認してください。