php - una - La conexión PDO funciona desde la línea de comandos, pero no a través de Apache.
conexion php mysqli (4)
Si se trata de una distribución derivada de Red Hat (RHEL, CentOS, Fedora, ScientificLinux) que ejecuta SELinux (o cualquier derivado que no sea de Red Hat utilizando SELinux), la configuración de política predeterminada en el momento de escribir esto es prohibir que Apache realice conexiones externas a otra servidores o bases de datos. Como root, debe habilitar los siguientes dos booleanos de SELinux. Use la opción -P
para persistir el cambio durante un reinicio.
setsebool -P httpd_can_network_connect=1
setsebool -P httpd_can_network_connect_db=1
Tenga en cuenta que httpd_can_network_connect
puede no ser necesario. Pruébelo primero solo encendiendo httpd_can_network_connect_db
.
Tengo un script de prueba muy simple:
<?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";
}
?>
Cuando ejecuto este script desde la línea de comandos, funciona perfectamente:
$ 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
Pero cuando accedo a la misma secuencia de comandos a través de mi navegador web, dice:
Could not connect to database, rawr. :-(
He intentado var_dump
en el error, y el mensaje es: "SQLSTATE [HY000] [2003] No se puede conectar al servidor MySQL en ''db.example.edu'' (13)".
Esto es desconcertante Es exactamente la misma secuencia de comandos en el mismo servidor exacto: ¿por qué funciona cuando lo ejecuto desde la línea de comandos, pero falla cuando Apache lo ejecuta?
Tuve el mismo problema para PHP ftp ftp_connect y tuve que configurar el
setsebool -P httpd_can_network_connect=1
Es confuso porque otras cosas como fil_get_contents
y curl funcionan bien con PHP y apache antes de configurar eso.
Mismo problema pero causa diferente aquí
Mi solución fue simplemente un sencillo apt-get install php-mysql
away
Asegúrese de comprobar pdo_mysql en su phpinfo ()
Lo encontré en esta publicación: PDOException "no se pudo encontrar el controlador"
Me pregunto por qué CLI funcionó en tales condiciones O_o ¿Quizás algo se instaló incorrectamente, o se superó? Bueno, ahora, funciona bien!
Además de usar la respuesta aceptada anteriormente
setsebool -P httpd_can_network_connect=1
setsebool -P httpd_can_network_connect_db=1
También tuve que cambiar el contexto de seguridad de un archivo al que httpd
intentaba acceder.
Un script php ejecutado a través de apache intentaba acceder a un archivo de certificado que estaba fuera de la raíz del documento normal de httpd
. Cambiar los permisos del archivo para permitir el acceso httpd no fue suficiente para permitir el acceso httpd a ese archivo. Tuve que cambiar también al contexto de seguridad, así que antes del cambio:
[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
Cambiar contexto usando:
sudo chcon -v --type=httpd_sys_content_t ../../certs/rds-ca-2015-root-us-east-1-BUNDLE.pem```
Llegar:
[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
Ahora todo está bien. Un buen recurso para mirar es /var/log/audit/audit.log
y prestar mucha atención a los errores. En mi caso, el error que apuntaba a la dirección de una resolución era:
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