我有一个非常简单的测试脚本:
<?php
$DSN = "mysql:host=db.example.edu;port=3306;dbname=search_data";
try {
$DB = new PDO($DSN, "username", "super-secret-password!");
} catch (PDOException $e) {
header('Content-Type: text/plain');
print "Could not connect to database, rawr. :-(";
exit;
}
$SQL = "SELECT phrase FROM search ORDER BY RAND() LIMIT 10";
foreach($DB->query($SQL) as $row){
print $row['phrase']."\n";
}
?>
当我从命令行执行此脚本时,它完美地运行:
$ php test.php
corporal punishment
Stretches
voluntary agencies and the resettlement of refugees
music and learning
Nike Tiger Woods Scandal
Hermeneia
PSYCHINFO
anthony bourdain
Black-White Couples and their Social Worlds
colonization, hodge
但是当我通过网络浏览器访问完全相同的脚本时,它会说:
Could not connect to database, rawr. :-(
我已经尝试了var_dump
错误,消息是:“SQLSTATE [HY000] [2003]无法连接到'db.example.edu'上的MySQL服务器(13)”。< / p>
这令人费解。它是完全相同的服务器上的相同脚本 - 为什么当我从命令行执行它时它可以工作,但是当Apache执行它时失败?
答案 0 :(得分:30)
如果这是运行SELinux的Red Hat派生版本(RHEL,CentOS,Fedora,ScientificLinux)(或任何使用SELinux的非Red Hat衍生版本),编写本文时的默认策略设置是禁止Apache进行外部操作与其他服务器或数据库的连接。作为root,您必须启用以下两个SELinux布尔值。使用-P
选项可以在重新启动时保留更改。
setsebool -P httpd_can_network_connect=1
setsebool -P httpd_can_network_connect_db=1
请注意,httpd_can_network_connect
可能没有必要。首先尝试启用httpd_can_network_connect_db
。
答案 1 :(得分:0)
我遇到了与PHP ftp ftp_connect相同的问题,并且必须设置
setsebool -P httpd_can_network_connect=1
令人困惑,因为fil_get_contents
和curl之类的其他内容在设置之前就可以通过PHP和apache工作了。
答案 2 :(得分:0)
另外使用上面接受的答案
setsebool -P httpd_can_network_connect=1
setsebool -P httpd_can_network_connect_db=1
我还必须更改httpd
尝试访问的文件的安全上下文。
通过apache运行的php脚本试图访问httpd
正常文档根目录之外的证书文件。更改文件权限以允许httpd访问不足以允许httpd访问该文件。我不得不改为安全上下文,因此在更改之前:
[admin]$ ls -Z ../../certs/rds-ca-2015-root-us-east-1-BUNDLE.pem
-rw-r--r--. admin apache unconfined_u:object_r:unlabeled_t:s0 ../../certs/rds-ca-2015-root-us-east-1-BUNDLE.pem
使用以下方式更改背景:
sudo chcon -v --type=httpd_sys_content_t ../../certs/rds-ca-2015-root-us-east-1-BUNDLE.pem```
得到:
[admin]$ ls -Z ../../certs/rds-ca-2015-root-us-east-1-BUNDLE.pem
-rw-r--r--. admin apache unconfined_u:object_r:httpd_sys_content_t:s0 ../../certs/rds-ca-2015-root-us-east-1-BUNDLE.pem
现在一切都很好。值得关注的一个好资源是/var/log/audit/audit.log
,并密切关注错误。在我的情况下,指向解决方向的错误是:
type=AVC msg=audit(1509047616.042:4049): avc: denied { read } for pid=17096 comm="httpd" name="rds-ca-2015-root-us-east-1-BUNDLE.pem" dev="xvdb" ino=262146 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:unlabeled_t:s0 tclass=file
答案 3 :(得分:-1)
同样的问题,但不同的原因在这里
我的解决方案只是一个简单的apt-get install php-mysql
远离
请务必检查phpinfo()中的pdo_mysql
在这篇文章中找到它:PDOException “could not find driver”
我想知道为什么CLI在这样的条件下工作O_o可能安装不正确,或者被覆盖?嗯,现在,它运作正常!