连接数据库错误类型:2002:权限被拒绝。

10
我正在尝试使用以下脚本(cxn-test.php)连接数据库。
<?php
$host = '155.30.136.20';//dummy ip 
$user = 'abc_user';
$pass = 'xxxxxxxxx';
$dbname = 'welcome';
$link = mysqli_connect($host, $user, $pass,$dbname);
if (!$link) {
    echo "Error: Unable to connect to MySQL." . PHP_EOL;
    echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
    echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
    exit;
}else {
    echo "success" . PHP_EOL;
}

在终端上尝试时:

php cxn-test.php //成功

但是在本地主机上尝试时,我遇到了以下错误:

curl -s http://localhost/cxn-test.php

错误:无法连接到MySQL。 调试错误号码:2002 调试错误:权限被拒绝

这是一个奇怪的问题,它在本地主机上不起作用,但在命令行上运行良好。


数据库在哪里?它在Docker容器中吗?您尝试过mysqli或PDO mysql吗? - user5201343
它位于另一台服务器上,我正在使用IP远程连接。 - Sundar
当通过命令行访问时,您是通过SSH连接到远程服务器还是与运行本地主机的计算机相同? - user5201343
远程服务器只。 - Sundar
1个回答

44

在安装了 SELinux 的 CentOS 7 系统中,我遇到了同样的问题。我可以通过命令行连接到远程 MySQL 数据库服务器,但 Drupal(以及测试 PHP 脚本)无法连接。

问题最终被确定为 SELinux 安全策略。

默认情况下,httpd_can_network_connect_db 策略是禁用的(这意味着您的 Web 服务器 无法 连接远程数据库)。

可以通过以下命令检查:

getsebool -a | grep httpd

如果 httpd_can_network_connect_db 是关闭状态,则需要通过以下命令启用:

setsebool -P httpd_can_network_connect_db 1

(使用-P标志可使更改永久生效,因此设置将在重新启动后保留。)


4
不错,加一分,没有让人们关闭SELinux! - miken32
1
我遇到了同样的问题,只有通过禁用SELinux才得以解决。感谢您的评论,让我注意到了这个问题。 - ankit9j
运行得很好。向你致敬。 - ajreal
找到这个(使用Redhat)花了我很长时间。非常感谢你。 - Richard
对于任何试图从Digital Ocean droplet远程连接到AWS实例的人来说,除了在实例上执行这些步骤之外,还需要在droplet上进行以下操作:https://dev59.com/Mmkw5IYBdhLWcg3wm74h - HWD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接