Tengo un script que ejecuto usando php artisan (con usuario root ) y, a veces, hace que el archivo de registro diario se cree antes de que lo haga el usuario de www-data de Apache , lo que significa que cuando un usuario real usa mi aplicación web, obtengo el error de permiso de carpeta:
Error al abrir la transmisión: permiso denegado
Cambio los permisos de nuevo a www-data cada vez, pero quiero resolver esto haciendo que el archivo de registro siempre se cree con los permisos correctos.
He considerado crear un trabajo cron que cree el archivo o lo toque para asegurarme de que tenga el permiso correcto todos los días, pero estoy buscando una solución mejor que no dependa de otro script.
También hemos considerado envolver php artisan en otro script para asegurarnos de que siempre se ejecute con las credenciales de www-data , pero algunas cosas que queremos hacer son en realidad root procedimientos de que apache no debería poder hacer.
¿Alguna sugerencia más?
cron
trabajo entouch
un nuevo archivo de registro a la medianoche todos los días (con el usuario correcto, por supuesto).php artisan
como el usuario que desea crear el archivo de registro.sudo crontab -u www-data -e
Respuestas:
Empecemos por lo constante.
Tienes un
php artisan
comando, correroot
.Es seguro asumir que este comando se ejecuta a diario.
Solución No 1:
Dado que el usuario que crea los archivos es el que tiene el permiso para escribir en él por defecto, podemos separar los logs por usuario como tal:
App/start/global.php
Si su usuario de www-data creara un registro de errores, resultaría en:
storage/logs/laravel-www-data-2015-4-27.log
.Si su raíz usuario fuera a crear un registro de errores, que se traduciría en:
storage/logs/laravel-root-2015-4-27.log
.Solución No 2:
Cambie el registro utilizado por su comando artesanal, en su script php.
En su
run()
función, agregue esta línea al principio:Si el nombre de su clase es
ArtisanRunner
, entonces su archivo de registro será:storage/logs/laravel-ArtisanRunner-2015-4-27.log
.Conclusión: La solución número 1 es mejor, dado que delinea sus registros por usuario y, por lo tanto, no se producirán errores.
EDITAR: Como señaló Jason,
get_current_user()
devuelve el nombre del propietario del script. Por lo tanto, para que se aplique la solución n. ° 1,chown
sus archivos de clase artesanal se asignan al nombre de usuario requerido.fuente
get_current_user()
devuelve el propietario del script PHP actual (según php.net) y no el usuario que está ejecutando el script actualmente . En suphp_sapi_name()
lugar utilizo , que da el nombre del controlador php (apache o cli, por ejemplo) que tenderá a ejecutarse como usuarios diferentes.Laravel versión 5.6.10 y posterior tiene soporte para un
permission
elemento en la configuración (config/logging.php
) parasingle
y eldaily
controlador:No es necesario hacer malabares con Monolog en el script de arranque.
Específicamente, se agregó soporte en https://github.com/laravel/framework/commit/4d31633dca9594c9121afbbaa0190210de28fed8 .
fuente
'permission' => 0664
funciona para mí (sin comillas)Para Laravel 5.1, uso lo siguiente hacia la parte inferior de
bootstrap/app.php
(como se menciona en los documentos ):Hay muchos otros controladores que puede utilizar en su lugar, por supuesto.
fuente
Para tales fines, debe utilizar ACL avanzada en sus archivos y directorios.
setfacl
sería tu respuesta aquí. Si desea otorgar permisos de usuario de www-data para escribir en los archivos raíz en un directorio específico, puede hacerlo así:Después de emitir esto, está configurando permisos
rwx
para el usuario de www-data en todos los archivos,/my/folder/
sin importar quién los haya creado. Por favor, consulte esta y esta pregunta como referencia. Además, puede consultar los documentossetfacl
.Déjeme saber si esto ayuda.
fuente
setfacl -d -m g:www-data:rw /full/path/to/laravel/storage/logs
seguido dephp artisan cache:clear
ycomposer dump-autoload
.Tenía esto funcionado de manera muy simple:
Me encontré con el mismo problema en Laravel 5.6
En
config/logging.php
Acabo de actualizar el valor de ruta del canal de todos los días conphp_sapi_name()
en ella.Esto crea un directorio separado para diferentes php_sapi_name y coloca el archivo de registro con la marca de tiempo en su directorio correspondiente.
Entonces para mi
fpm-fcgi
directorio: Registros del sitio web,owner: www-data
cli
directorio: desde el comando artisan (cronjob).owner: root
Más información sobre el registro de Laravel 5.6: https://laravel.com/docs/5.6/logging
Aquí está mi
config/logging.php
archivo:fuente
artisan config:cache
, ya que creará una caché de configuración usando el cli SAPI que se usará tanto para CLI como para solicitudes web.get_current_user
no funciona, perophp_sapi_name
funciona (aunque parece más feo)Para mí, este problema era mucho más que los permisos de registro ... Tuve problemas con cualquier cosa relacionada con el arranque / caché y las carpetas de almacenamiento donde un usuario creaba un archivo / carpeta y el otro no podía editar / eliminar debido al estándar 644 y 755 permisos.
Los escenarios típicos son:
El archivo bootstrap / cache / compiled.php está siendo creado por el usuario de Apache, pero el usuario del compositor no puede editarlo al ejecutar el comando de instalación del compositor.
El usuario de apache que crea un caché que no se puede borrar con el usuario del compositor
El sueño es que no importa qué usuario cree el archivo / carpeta, los otros usuarios que necesitan acceder tengan exactamente los mismos permisos que el autor original.
TL; DR?
Así es como se hace.
Necesitamos crear un grupo de usuarios compartidos llamado laravel, el grupo consta de todos los usuarios que necesitan acceso a los directorios de almacenamiento y bootstrap / cache. A continuación, debemos asegurarnos de que los archivos y carpetas recién creados tengan el grupo laravel y los permisos 664 y 775 respectivamente.
Es fácil hacer esto para archivos / directorios existentes, pero se necesita un poco de magia para modificar las reglas predeterminadas de creación de archivos / carpetas ...
Simplemente con fines de depuración, encontré que dividir los registros en usuarios cli / web + era beneficioso, así que modifiqué ligeramente la respuesta de Sam Wilson. Mi caso de uso fue que la cola se ejecutó bajo su propio usuario, por lo que ayudó a distinguir entre el usuario compositor que usa el cli (por ejemplo, pruebas unitarias) y el demonio de la cola.
fuente
configureMonologUsing
embargo, ¿su código sigue siendo necesario una vez que haya ejecutado lossetfacl
comandos?Laravel 5.1
En nuestro caso, queríamos crear todos los archivos de registro para que todo el
deploy
grupo tuviera permisos de lectura / escritura. Por lo tanto, necesitábamos crear todos los archivos nuevos con0664
permisos, a diferencia del0644
predeterminados.También agregamos un formateador para agregar nuevas líneas para una mejor legibilidad:
También es posible combinar esto con la respuesta aceptada
fuente
Una forma que no es Laravel de hacer que esto funcione es simplemente ejecutar su cronjob como www-data.
por ejemplo, /ubuntu/189189/how-to-run-crontab-as-userwww-data
fuente
Laravel 5.5
Agregue este código a
bootstrap/app.php
:laravel-2018-01-27-cli-raph.log
ylaravel-2018-01-27-fpm-cgi-raph.log
cuál es más legible.Laravel 5.6
Tienes que crear una clase para tu registrador:
Luego, debes registrarlo en
config/logging.php
:Mismo comportamiento que para 5.5:
laravel-2018-01-27-cli-raph.log
ylaravel-2018-01-27-fpm-cgi-raph.log
cuál es más legible.fuente
Agregue algo como lo siguiente al comienzo de su
app/start/artisan.php
archivo (esto es con Laravel 4):Ajuste la ruta si el archivo de registro diario que menciona no es el archivo de registro estándar de Laravel. Es posible que tampoco desee cambiar el grupo o establecer los permisos como lo estoy haciendo aquí. Lo anterior establece el grupo
www-data
y establece permisos de escritura de grupo. Luego agregué a mi usuario habitual alwww-data
grupo para que la ejecución de comandos artesanales como mi usuario habitual todavía pueda escribir en el registro.Un ajuste relacionado es poner lo siguiente al comienzo de su
app/start/global.php
archivo:Si hace esto, la
chmod
línea anterior se vuelve discutible. Con la umask configurada para esto, cualquier archivo nuevo que PHP (y por lo tanto Laravel) cree tendrá sus permisos enmascarados solo para que "otros" usuarios no tengan permisos de escritura. Esto significa que los directorios comenzarán comorwxrwxr-x
y los archivos comorw-rw-r--
. Entonces, siwww-data
está ejecutando PHP, cualquier caché y archivos de registro que cree serán grabables por defecto por cualquier persona en el grupo principal de ese usuario, que eswww-data
.fuente
(Laravel 5.6) Recientemente me encontré con el mismo problema y simplemente configuré un comando programado para que se ejecutara
/app/Console/Kernel.php
.$schedule->exec('chown -R www-data:www-data /var/www/**********/storage/logs')->everyMinute();
Sé que es un poco exagerado, pero funciona como un encanto y no he tenido ningún problema desde entonces.
fuente
Laravel 5.4
\Log::getMonolog()->popHandler(); \Log::useDailyFiles(storage_path('/logs/laravel-').get_current_user().'.log');
añadir a la
boot
función enAppServiceProvider
fuente
Laravel 5.8
Laravel 5.8 te permite establecer el nombre de inicio de sesión
config/logging.php
.Entonces, usando respuestas y comentarios anteriores, si desea nombrar su registro usando tanto el nombre de usuario real de posix como el
php_sapi_name()
valor, solo necesita cambiar el nombre del registro establecido. El uso del controlador diario permite la rotación de registros que se ejecuta por combinación de usuario / api, lo que garantizará que el registro siempre sea rotado por una cuenta que pueda modificar los registros.También agregué una verificación para las funciones posix que pueden no existir en su entorno local, en cuyo caso el nombre del registro simplemente es el estándar por defecto.
Suponiendo que está utilizando el canal de registro predeterminado 'diariamente', puede modificar su clave de 'canales' así:
Esto dará como resultado un nombre de registro que debe ser único para cada combinación, como
laravel-cli-sfscs-2019-05-15.log
olaravel-apache2handler-apache-2019-05-15.log
según su punto de acceso.fuente
Simplemente puede cambiar el permiso del archivo de registro en su comando artesanal:
donde get_current_user () devolverá el usuario del script actual.
En otras palabras,
daily.log
siempre tendráwww-data
como propietario, incluso si inicializa el script comoroot
usuario.fuente
Si está usando Laravel Envoyer , aquí hay una posible solución al usar ACL en Linux:
1. Primero, ejecute el siguiente script con
root
permisos en el servidor:2. Configure el siguiente enlace de implementación en el enviado en "Activar nueva versión"> "Antes de esta acción
3. Vuelva a implementar su aplicación
Ahora vuelva a implementar su aplicación y debería funcionar en el futuro.
fuente
fuente
La mejor manera que encontré es que fideloper sugiere, http://fideloper.com/laravel-log-file-name , puede establecer la configuración del registro de laravel sin la clase de registro táctil. Tener diferentes nombres para los programas de consola y los programas Http, creo, es la mejor solución.
fuente
Esta solución definitivamente funcionará en Laravel V5.1 - V6.x
Razones de este error:
.env
archivo no encontrado en su directorio raízReparar:
touch .env
y pegue las variables de entorno y luego ejecutefuente