Finalmente descubrió una solución. Ejecuté estas 2 funciones para archivar recursivamente la carpeta y los permisos de archivo de www y dentro.
find /var/www -type d -exec chmod 755 {} \;
find /var/www -type f -exec chmod 644 {} \;
Leí esta página aquí:https://wiki.apache.org/httpd/13PermissionDenied y básicamente me explicó y me recordó que los permisos se heredan, "haz lo mismo para el directorio y cada directorio principal". Así que ejecuté esos 2 y todo volvió a funcionar.
Por lo general, el permiso de ejecución para una ruta no está configurado, como en esta pregunta. La forma más fácil de resolver esto es el siguiente comando:
chmod a+rX -R /var/www
Pero al usar CentOS7 o RHEL7 puede encontrar problemas con SELinux. Si los permisos de archivo son correctos y aún recibe el error, consulte el siguiente registro:
tail -f /var/log/audit/audit.log
Si recibe un mensaje como este:
type=AVC msg=audit(1464350432.916:8222): avc: denied { getattr } for pid=17526 comm="httpd" path="/var/www/app/index.html" dev="sda1" ino=42021595 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:var_t:s0 tclass=file
type=SYSCALL msg=audit(1464350432.916:8222): arch=c000003e syscall=4 success=no exit=-13 a0=7fde4e450d40 a1=7ffd05e79640 a2=7ffd05e79640 a3=7fde42e43792 items=0 ppid=17524 pid=17526 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="httpd" exe="/usr/sbin/httpd" subj=system_u:system_r:httpd_t:s0 key=(null)
Esto significa:SELinux bloquea el acceso a la raíz de su documento. Puede probar un comando como este (Recursivo y detallado en la opción -Rv
):
chcon --user system_u --type httpd_sys_content_t -Rv /var/www/app/public
Para encontrar la configuración correcta, busque en un directorio de trabajo como /var/www/html
con esto:
ls -laZ /var/www/
Debería verse como:
drwxr-xr-x. server server system_u:object_r:httpd_sys_content_t:s0 .
drwxr-xr-x. root root system_u:object_r:var_t:s0 ..
drwxr-xr-x. server server system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin
drwxr-xr-x. server server system_u:object_r:httpd_sys_content_t:s0 html
drwxrwxr-x. server server unconfined_u:object_r:var_t:s0 app
Para las personas que podrían haber probado lo anterior y aún tienen problemas, asegúrese de que ninguno de los directorios en la ruta tenga una ACL que impida el acceso de Apache.
Puedes usar:
getfacl <directoryname>
para obtener los permisos en el directorio que podrían haberse configurado mediante ACL. Verá algo así a continuación que básicamente dice que el usuario tiene todos los permisos y que el grupo ha leído y ejecutado (o buscado) pero no escrito:
# file: <directoryname>
# owner: username
# group: username
user::rwx
user:1000:rwx
group::---
group:username:r-x
mask::rwx
other::rwx
Para dar acceso a apache o a un grupo para usar ACL, use lo siguiente:
setfacl -m g:<groupname>:rx <directoryname>
solo asegúrese de que los directorios principales tengan lo mismo. Puede usar el modificador -R para realizar el cambio recursivamente en el directorio superior.
Me encontré con este mismo problema de permisos de apache y me golpeaba la cabeza tratando de averiguar por qué chmod y chown no tenían efecto antes de recordar que había configurado ACL en el directorio cuando usaba Samba hace un tiempo.