No se registran los logs en CentOS, PHP no puede escribir en la ruta? – Solución

0
254

Hola a todos, ya hace varios días me había topado con este problema con apache y php.

Instalando un centos7 desde 0 aveces las configuraciones de los permisos suelen ser un dolor de cabeza. Esta es la segunda vez que me sucede y para no perder tiempo de nuevo buscando cual es el problema, he decidido publicar la solución definitiva a esos problemas.

 

La solución original esta en ingles y el autor original es lysender,

les dejo el link del original y espero les ayude a solucionar también su problema.

 

 

Problema 1: no se pueden servir archivos en un directorio personalizado
El primer problema que encontré es que intenté configurar la aplicación desde adentro /data/www/html/sites/mysite. Cuando se ve en el navegador, dice 403 Prohibido y los registros de errores dicen:

13)Permission denied: [client 121.54.44.93:23180] AH00529: /data/www/html/sites/mysite/.htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable and that '/data/www/html/sites/mysite/' is executable

La estructura del directorio tiene propiedad y permisos adecuados, por ejemplo, el directorio es propiedad de apache:apache, el permiso de archivo es 0644y el permiso de directorio es 0755. No tiene sentido en absoluto. Sin embargo, me di cuenta de que la raíz de documentos predeterminada no tiene problemas para servir el archivo php, así que decidí entregarlo fuera del /var/www/html/mysitedirectorio, que es la raíz de documentos predeterminada.

Problema 2: No se puede escribir en el archivo
Pasar al directorio raíz de documentos por defecto hizo el truco y pude ejecutar la aplicación pero con errores. El error dice que no se puede escribir en el archivo, aunque nuevamente, los permisos adecuados ya están configurados en el directorio. A continuación se muestra el error (es un registro de errores personalizado, pero si no funciona la escritura en el archivo de registro, imagine cómo funcionaría la funcionalidad de carga):

 

PHP Warning: fopen(/var/www/html/mysite/application/config/../../logs/web/20150708.ALL.log): failed to open stream: Permission denied in /var/www/html/mysite/application/core/App_Exceptions.php
¡Sorpresa! ¡SELinux está aquí!
Ustedes eligen CentOS, así que también tienen SELinux.

Después de darme cuenta de que fue SELinux quien tuvo problemas conmigo durante las últimas 2 horas, estaba pensando en deshacerme de CentOS e irme con el Ubuntu recomendado. Pero luego mi instinto me dice que si SELinux está bloqueando las operaciones de lectura / escritura, debe hacerlo por una buena razón, y eso fue por seguridad. Me doy cuenta de que necesita especificar en qué archivos / directorios Apache puede servir los archivos y en qué archivos / directorios puede escribir.

Parece que SELinux tiene algunas reglas / políticas que se aplican a los archivos / directorios sobre la estructura de permisos de archivos unix. Cuando ejecuto el siguiente comando en la raíz de documentos predeterminada, vi más información sobre los permisos de archivo / directorio.

ls -Z /var/www/html/mysite

A continuación se muestra la salida (algunos datos eliminados):

drwxr-xr-x. apache apache unconfined_u:object_r:httpd_sys_content_t:s0 application
-rw-r--r--. apache apache unconfined_u:object_r:httpd_sys_content_t:s0 index.php

Y a continuación es lo que tengo para otros directorios normales:

 

drwxr-xr-x. apache apache unconfined_u:object_r:default_t:s0 www

Por lo tanto, podemos concluir que necesitamos especificar los permisos correctos de SELinux en los directorios para poder servir los archivos en un directorio personalizado y establecer otros permisos de SELinux para permitir la escritura en el archivo. Por lo tanto, podemos resolver el problema original entonces.

Arreglando el problema original.
¿Así que queremos servir nuestros archivos /data/www/html/sites/mysitey habilitar la escritura para registrar archivos y subir archivos también? Vamos a jugar bien con SELinux.

Primero, copie los archivos como de costumbre /data/www/html/sites/mysite, luego establezca la propiedad y los permisos adecuados.

# Ownership
sudo chown apache:apache -R /data/www/html/sites/mysite
cd /data/www/html/sites/mysite

# File permissions, recursive
find . -type f -exec chmod 0644 {} \;

# Dir permissions, recursive
find . -type d -exec chmod 0755 {} \;

# SELinux serve files off Apache, resursive
sudo chcon -t httpd_sys_content_t /data/www/html/sites/mysite -R

# Allow write only to specific dirs
sudo chcon -t httpd_sys_rw_content_t /data/www/html/sites/mysite/logs -R
sudo chcon -t httpd_sys_rw_content_t /data/www/html/sites/mysite/uploads -R

httpd_sys_content_t- para permitir que Apache sirva estos contenidos y httpd_sys_rw_content_t- para permitir que Apache escriba en esas rutas.

¡Eso es! Disfruté y compartes!

 

 

Cualquier duda dejen sus comentarios.

Dejar respuesta

Please enter your comment!
Please enter your name here