0

我也在stackexchange上问过这个问题,但它开始看起来更像是一个编程问题而不是配置

运行cakephp的centos服务器无法访问远程mysql服务器但可以通过pdo connect在cake外访问

我可以使用 mysql 命令行客户端使用相同的凭据和选项进行连接。但是,当蛋糕尝试连接到远程服务器时,我得到的只是

Error: SQLSTATE[HY000] [2003] Can't connect to MySQL server on 'subdomian.domain.com' (13) requires a database connection

我试着运行这个

 GRANT ALL PRIVILEGES ON *.* TO 'myrootuser'@'webserver.domain.com' WITH GRANT OPTION;

这对我没有帮助,因为我知道我可以通过 cli 连接

我可以从我的家用电脑蛋糕实例远程连接没有问题相同的主机相同的凭据相同的一切

然而,我的 centos apache 服务器运行 cake 并安装了所有正确的 mysql 包无法连接

我使用正确的用户名密码端口一切,我不断收到该错误

我已经清除了 tmp 文件夹缓存 我使用 apc 清除缓存 我什至重新启动了 httpd

我已经做了一切。没有任何效果。

我有事件尝试暂时关闭两台机器上的防火墙......没有骰子同样的错误

我什至尝试创建一个仅使用 pdo 连接到数据库并从命令行运行它的 php 文件,它显示已连接到数据库!

为什么蛋糕不能用蛋糕做。它显然可以从一个单独的 php 文件中工作

我一遍又一遍地验证了我的信誉和主机

我再次能够在本地机器上使用完全相同的代码库进行连接

所以必须有类似神秘蛋糕或centos apache之类的东西

我也在运行 APC Restarting mysqld 并且 httpd 并没有改变任何东西。我对这种废话束手无策。

这是我正在测试的 php 脚本

$hostname = "my.dns.name.tohost";
$username = "myrootuser";
$password = "myrootuserpass";

try {
  $db = new PDO("mysql:host=$hostname;dbname=myDbSchemaName", $username, $password);
  echo "Connected to database";
}
catch(PDOException $e) {
  echo $e->getMessage();
}

// 控制台输出

Connected to database[root@localhost ~]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]
[root@localhost ~]# php connectInt.php
Connected to database[root@localhost ~]#

所以我很酷,让我们再次尝试站点。

Error: SQLSTATE[HY000] [2003] Can't connect to MySQL server on 'subdomian.domain.com' (13) requires a database connection

没有任何作用

我什至在php中尝试了其他方法我使用相同的credentails做了一个普通的mysql连接脚本它可以连接它可以看到所有的数据库。

<?php
$hostname = "dns.name.com";
$username = "mygoodtestednonrootuser";
$password = "somepasswoerd";

try {
  $db = new PDO("mysql:host=$hostname;dbname=int_zzipline", $username, $password);

$link = mysql_connect($hostname, $username, $password);
$db_list = mysql_list_dbs($link);
while ($row = mysql_fetch_object($db_list))
{
    echo 'Connected to database';
    echo $row->Database . "\n";
}   

}
catch(PDOException $e) {
  echo $e->getMessage();
}
?>


[root@localhost ~]# php connectInt.php
information_schema
mydbname1
myotherdb
mysql
test

所以我很酷,让我们再试试这个网站

Error: SQLSTATE[HY000] [2003] Can't connect to MySQL server on 'subdomian.domain.com' (13) requires a database connection

这至少可以说是令人愤怒的。

所以 cakephp 不喜欢在没有打开任何防火墙的情况下连接到同一子网中的其他 linux 服务器,但使用相同凭据执行的任何其他 php 都可以工作。我的本地电脑运行完全相同的代码库,与同一台服务器通信。

4

1 回答 1

2

SELINUX 是罪魁祸首。一旦我禁用它并重新启动,一切都很好。我在 /opt 中运行我的网络虚拟主机以帮助进行混淆,但它似乎是我最大的痛苦,你知道一直以来使用简单的东西,比如给 apache 对日志的写访问权限,上传,一切都是因为 SELINUX。它甚至阻止 cake 与它可以正常通信的数据库通信。

我知道 centos 作为老板是安全的,但现在我知道为什么了。SELINUX

了解它,它的作用并发现一个 centos 不再固执己见的世界 SELinux 是 CentOS 的他的小朋友,它会遮盖你的屁股而不是破坏你的蛋蛋。

权力伴随着巨大的责任。当我克服这个问题时,我将开始重新配置我的服务器以负责任地使用 SELINUX,而不是在不知道我为什么使用它的情况下使用它。哦,当然还有解决方案:

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - SELinux is fully disabled.
#SELINUX=enforcing
SELINUX=disabled
# SELINUXTYPE= type of policy in use. Possible values are:
#       targeted - Only targeted network daemons are protected.
#       strict - Full SELinux protection.
SELINUXTYPE=targeted
SETLOCALDEFS=0

哦,我差点忘了……你可以在 /ect/selinux 中找到配置文件

只要把你的改成这样,你就可以做任何你喜欢的事情了。但h4x0rz也会如此

于 2012-09-23T19:48:04.777 回答