在使用PHP 進行數據庫連接時,尤其是使用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 或域名。
要解決“Host not allowed to connect”問題,需要在MySQL 服務器上給指定的客戶端主機授權。
假設你的數據庫用戶名是dbuser ,需要允許從遠程主機IP 123.123.123.123連接:
GRANT ALL PRIVILEGES ON database.* TO 'dbuser'@'123.123.123.123' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
如果你想允許所有主機連接(不建議生產環境使用),可以用%通配符:
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 錯誤日誌,獲取更多細節。