У меня есть скрипт, который я запускаю с помощью php artisan (с пользователем root ), и иногда он вызывает создание файла ежедневного журнала до того, как это сделает пользователь apache www-data - это означает, что когда реальный пользователь использует мое веб-приложение, я получаю ошибка разрешения папки:
Не удалось открыть поток: в доступе отказано
Я снова меняю разрешения на каждый раз www-data, но я хочу решить эту проблему, создав файл журнала с правильными разрешениями.
Я подумывал о создании задания cron, которое создает файл или касается его, чтобы каждый день обеспечивать правильное разрешение, но я ищу лучшее решение, которое не полагается на другой скрипт.
Мы также рассмотрели возможность включения php artisan в другой скрипт, чтобы убедиться, что он всегда запускается с учетными данными www-data , но некоторые вещи, которые мы хотим сделать, на самом деле корневыми процедурами, которые apache не должен выполнять.
Есть еще предложения?
cron
задание наtouch
новый файл журнала в полночь каждый день (конечно, под правильным пользователем).php artisan
от имени пользователя, которому вы хотите создать файл журнала.sudo crontab -u www-data -e
Ответы:
Начнем с того, что постоянно.
У вас есть
php artisan
команда, которую вы выполняетеroot
.Можно с уверенностью предположить, что эта команда выполняется ежедневно.
Решение № 1:
Учитывая, что пользователь, который создает файлы, по умолчанию имеет разрешение на запись в него, мы можем разделить журналы по пользователям как таковым:
App/start/global.php
Если ваш WWW-данные пользователя должны были создать журнал ошибок, это приведет к:
storage/logs/laravel-www-data-2015-4-27.log
.Если ваш корневой пользователь должны были создать журнал ошибок, это приведет к:
storage/logs/laravel-root-2015-4-27.log
.Решение № 2:
Измените журнал, используемый вашей командой artisan, в вашем php-скрипте.
В своей
run()
функции добавьте эту строку в начало:Если имя вашего класса
ArtisanRunner
, тогда ваш файл журнала будет:storage/logs/laravel-ArtisanRunner-2015-4-27.log
.Вывод: Решение №1 лучше, поскольку оно разграничивает ваши журналы по пользователям, и, следовательно, ошибок не возникает.
EDIT: как указано Джейсоном,
get_current_user()
возвращает имя владельца скрипта. Следовательно, чтобы применить решение № 1,chown
ваши файлы классов мастера к требуемому имени пользователя.источник
get_current_user()
возвращает владельца текущего скрипта PHP (согласно php.net), а не пользователя, который в данный момент запускает скрипт.php_sapi_name()
Вместо этого я использую , что дает имя обработчика php (например, apache или cli), который будет запускаться от имени разных пользователей.Laravel версии 5.6.10 и новее поддерживает
permission
элемент в конфигурации (config/logging.php
) дляsingle
иdaily
драйвера:Не нужно жонглировать Monolog в сценарии начальной загрузки.
В частности, поддержка была добавлена в https://github.com/laravel/framework/commit/4d31633dca9594c9121afbbaa0190210de28fed8 .
источник
'permission' => 0664
у меня работает (без кавычек)Для Laravel 5.1 я использую следующее внизу
bootstrap/app.php
(как указано в документации ):Конечно, вы можете использовать множество других обработчиков.
источник
Для таких целей вы должны использовать расширенный ACL для ваших файлов и каталогов.
setfacl
был бы ваш ответ здесь. Если вы хотите предоставить пользователю www-data права на запись в файлы root в определенном каталоге, вы можете сделать это следующим образом:После выдачи этого вы устанавливаете разрешения
rwx
для пользователя www-data для всех файлов/my/folder/
независимо от того, кто их создал. Пожалуйста, прочтите этот и этот вопрос для справки. Кроме того, вы можете проверить документы дляsetfacl
.Позвольте мне знать, если это помогает.
источник
setfacl -d -m g:www-data:rw /full/path/to/laravel/storage/logs
а затемphp artisan cache:clear
иcomposer dump-autoload
.У меня это сработало очень просто:
Я столкнулся с той же проблемой на Laravel 5.6
В
config/logging.php
я только что обновил ежедневное значение пути каналаphp_sapi_name()
.Это создает отдельный каталог для разных php_sapi_name и помещает файл журнала с отметкой времени в соответствующий каталог.
Так что для меня
fpm-fcgi
журналов создаются в каталоге: Журналы с веб-сайта,owner: www-data
cli
каталоге: из команды artisan (cronjob).owner: root
Дополнительная информация о ведении журнала Laravel 5.6: https://laravel.com/docs/5.6/logging
Вот мой
config/logging.php
файл:источник
artisan config:cache
, так как он создаст кеш конфигурации с использованием cli SAPI, который будет использоваться как для CLI, так и для веб-запросов.get_current_user
не работает, ноphp_sapi_name
работает (хотя кажется уродливее)Для меня эта проблема была намного больше, чем права доступа к журналу ... У меня были проблемы со всем, что связано с папками начальной загрузки / кеша и хранилища, где один пользователь создавал файл / папку, а другой не мог редактировать / удалять из-за стандарта 644 и 755 разрешений.
Типичные сценарии:
Файл bootstrap / cache / compiled.php создается пользователем apache, но не редактируется пользователем-композитором при выполнении команды установки композитора.
Пользователь apache создает кеш, который нельзя очистить с помощью пользователя-композитора
Мечта состоит в том, что независимо от того, какой пользователь создает файл / папку, другие пользователи, которым требуется доступ, имеют точно такие же права, как и исходный автор.
TL; DR?
Вот как это делается.
Нам нужно создать общую группу пользователей под названием laravel, группа состоит из всех пользователей, которым нужен доступ к каталогам хранилища и начальной загрузки / кеша. Затем нам нужно убедиться, что вновь созданные файлы и папки имеют разрешения группы laravel и 664 и 775 соответственно.
Это легко сделать для существующих файлов / каталогов, но нужно немного волшебства, чтобы настроить правила создания файлов / папок по умолчанию ...
Чисто для целей отладки я обнаружил, что разделение журналов на пользователей cli / web + было полезным, поэтому я немного изменил ответ Сэма Уилсона. Моим вариантом использования была очередь, запущенная под собственным пользователем, поэтому она помогала различать пользователя-композитора, использующего cli (например, модульные тесты), и демона очереди.
источник
configureMonologUsing
код все еще необходим после того, как вы запуститеsetfacl
команды?Laravel 5.1
В нашем случае мы хотели создать все файлы журналов, чтобы все в
deploy
группе имели разрешения на чтение / запись. Поэтому нам нужно было создать все новые файлы с0664
разрешениями, а не с разрешениями по0644
умолчанию.Мы также добавили средство форматирования, чтобы добавить новые строки для лучшей читаемости:
Также можно объединить это с принятым ответом
источник
Один из способов, не связанных с Laravel, - просто выполнить задание cron как www-data.
например /ubuntu/189189/how-to-run-crontab-as-userwww-data
источник
Laravel 5.5
Добавьте этот код в
bootstrap/app.php
:laravel-2018-01-27-cli-raph.log
иlaravel-2018-01-27-fpm-cgi-raph.log
что более читабельно.Laravel 5.6
Вы должны создать класс для вашего регистратора:
Затем вы должны зарегистрировать его в
config/logging.php
:То же поведение, что и для 5.5:
laravel-2018-01-27-cli-raph.log
иlaravel-2018-01-27-fpm-cgi-raph.log
что более читабельно.источник
Добавьте что-то вроде следующего в начало вашего
app/start/artisan.php
файла (это с Laravel 4):Измените путь, если упомянутый вами ежедневный файл журнала не является стандартным файлом журнала Laravel. Вы также можете не захотеть изменять группу или устанавливать разрешения, как я делаю здесь. Вышеупомянутое устанавливает группу
www-data
и устанавливает права записи группы. Затем я добавил своего обычного пользователя вwww-data
группу, так что, выполняя команды artisan от имени моего обычного пользователя, я все еще могу писать в журнал.Связанная с этим настройка - добавить в начало
app/start/global.php
файла следующее:Если вы делаете это
chmod
выше линии становится спорным. Если umask установлен на это, любые новые файлы, которые создает PHP (и, следовательно, Laravel), будут замаскированы только для того, чтобы «другие» пользователи не имели прав на запись. Это означает, что каталоги будут начинаться как,rwxrwxr-x
а файлы какrw-rw-r--
. Таким образом, еслиwww-data
запущен PHP, любые файлы кеша и журналов, которые он создает, по умолчанию будут доступны для записи любому члену основной группы этого пользователя, а именноwww-data
.источник
(Laravel 5.6) Недавно я столкнулся с той же проблемой, и я просто установил запланированную команду для запуска
/app/Console/Kernel.php
.$schedule->exec('chown -R www-data:www-data /var/www/**********/storage/logs')->everyMinute();
Я знаю, что это немного излишне, но работает как шарм, и с тех пор никаких проблем не возникало.
источник
Laravel 5.4
\Log::getMonolog()->popHandler(); \Log::useDailyFiles(storage_path('/logs/laravel-').get_current_user().'.log');
добавить к
boot
функции вAppServiceProvider
источник
Laravel 5.8
Laravel 5.8 позволяет вам установить имя журнала в
config/logging.php
.Итак, используя предыдущие ответы и комментарии, если вы хотите назвать свой журнал, используя как фактическое имя пользователя posix, так и
php_sapi_name()
значение, вам нужно только изменить установленное имя журнала. Использование ежедневного драйвера позволяет ротацию журналов, которая выполняется для каждой комбинации пользователь / API, что гарантирует, что журнал всегда будет вращаться учетной записью, которая может изменять журналы.Я также добавил проверку функций posix, которые могут не существовать в вашей локальной среде, и в этом случае имя журнала просто по умолчанию соответствует стандарту.
Предполагая, что вы используете канал журнала по умолчанию «daily», вы можете изменить ключ «каналов» следующим образом:
Это приведет к имени журнала , который должен быть уникальным для каждой комбинации , такие как
laravel-cli-sfscs-2019-05-15.log
или вlaravel-apache2handler-apache-2019-05-15.log
зависимости от точки доступа.источник
Вы можете просто изменить разрешение файла журнала в своей команде artisan:
где get_current_user () вернет пользователя текущего скрипта.
Другими словами,
daily.log
он всегда будетwww-data
его владельцем, даже если вы инициализируете скрипт какroot
пользователь.источник
Если вы используете Laravel Envoyer , вот возможное исправление с помощью ACL в Linux:
1. Сначала запустите следующий сценарий с
root
разрешениями на сервере:2. Настройте следующий обработчик развертывания на envoyer в разделе «Активировать новый выпуск»> «Перед этим действием».
3. Повторно разверните приложение.
Теперь разверните приложение заново, и оно должно работать в дальнейшем.
источник
источник
Лучший способ, который я нашел, - это то, что fideloper предлагает http://fideloper.com/laravel-log-file-name , вы можете установить конфигурацию журнала laravel без касания класса журнала. Иметь разные имена для консольных программ и Http-программ, я думаю, это лучшее решение.
источник
Это решение определенно будет работать на Laravel V5.1 - V6.x
Причины этой ошибки:
.env
файл не найден в корневом каталогеИсправить:
touch .env
и вставьте переменные среды, а затем запуститеисточник