Ежедневный журнал Laravel создан с неправильными разрешениями


112

У меня есть скрипт, который я запускаю с помощью php artisan (с пользователем root ), и иногда он вызывает создание файла ежедневного журнала до того, как это сделает пользователь apache www-data - это означает, что когда реальный пользователь использует мое веб-приложение, я получаю ошибка разрешения папки:

Не удалось открыть поток: в доступе отказано

Я снова меняю разрешения на каждый раз www-data, но я хочу решить эту проблему, создав файл журнала с правильными разрешениями.

Я подумывал о создании задания cron, которое создает файл или касается его, чтобы каждый день обеспечивать правильное разрешение, но я ищу лучшее решение, которое не полагается на другой скрипт.

Мы также рассмотрели возможность включения php artisan в другой скрипт, чтобы убедиться, что он всегда запускается с учетными данными www-data , но некоторые вещи, которые мы хотим сделать, на самом деле корневыми процедурами, которые apache не должен выполнять.

Есть еще предложения?


Настройте cronзадание на touchновый файл журнала в полночь каждый день (конечно, под правильным пользователем).
Бен Гарольд

@BenHarold Спасибо, мы учли это, но я бы не стал задействовать больше скриптов.
NiRR

2
В этом случае вам нужно будет запустить php artisanот имени пользователя, которому вы хотите создать файл журнала.
Бен Гарольд

@BenHarold Еще раз спасибо, мы тоже подумали, что, вероятно, лучший способ, но я обновил вопрос, чтобы объяснить, почему это тоже не идеально.
NiRR

2
Что сработало для меня, так это запустить cron как пользователь www-data сsudo crontab -u www-data -e
Nil Llisterri

Ответы:


67

Начнем с того, что постоянно.

У вас есть php artisanкоманда, которую вы выполняете root.

Можно с уверенностью предположить, что эта команда выполняется ежедневно.

Решение № 1:

Учитывая, что пользователь, который создает файлы, по умолчанию имеет разрешение на запись в него, мы можем разделить журналы по пользователям как таковым:

App/start/global.php

/*
|--------------------------------------------------------------------------
| Application Error Logger
|--------------------------------------------------------------------------
|
| Here we will configure the error logger setup for the application which
| is built on top of the wonderful Monolog library. By default we will
| build a basic log file setup which creates a single file for logs.
|
*/

Log::useDailyFiles(storage_path().'/logs/laravel-'.get_current_user().'.log');

Если ваш WWW-данные пользователя должны были создать журнал ошибок, это приведет к: storage/logs/laravel-www-data-2015-4-27.log.

Если ваш корневой пользователь должны были создать журнал ошибок, это приведет к: storage/logs/laravel-root-2015-4-27.log.

Решение № 2:

Измените журнал, используемый вашей командой artisan, в вашем php-скрипте.

В своей run()функции добавьте эту строку в начало:

Log::useFiles(storage_path().'/logs/laravel-'.__CLASS__.'-'.Carbon::now()->format('Y-m-d').'.log');

Если имя вашего класса ArtisanRunner , тогда ваш файл журнала будет:

storage/logs/laravel-ArtisanRunner-2015-4-27.log.

Вывод: Решение №1 лучше, поскольку оно разграничивает ваши журналы по пользователям, и, следовательно, ошибок не возникает.

EDIT: как указано Джейсоном, get_current_user()возвращает имя владельца скрипта. Следовательно, чтобы применить решение № 1, chownваши файлы классов мастера к требуемому имени пользователя.


12
Обратите внимание, что get_current_user()возвращает владельца текущего скрипта PHP (согласно php.net), а не пользователя, который в данный момент запускает скрипт. php_sapi_name()Вместо этого я использую , что дает имя обработчика php (например, apache или cli), который будет запускаться от имени разных пользователей.
Джейсон

1
Могу ли я предложить использовать оба имени пользователя, выполняющего сценарий, и php_sapi_name в комбинации, поскольку многие пользователи могут запускать Laravel из интерфейса командной строки, например, несколько администраторов баз данных получают доступ к вашему серверу, или вы можете захотеть, чтобы Laravel CRON запускался как apache. получить имя процесса, выполняющего этот сценарий, используя posix_getpwuid (posix_geteuid ()) ['name']; Смотрите мой полный пост ниже.
Эндрю

Это необходимо обновить для последних версий Laravel: v5 +
Эндрю,

108

Laravel версии 5.6.10 и новее поддерживает permissionэлемент в конфигурации ( config/logging.php) для singleи dailyдрайвера:

    'daily' => [
        'driver' => 'daily',
        'path' => storage_path('logs/laravel.log'),
        'level' => 'debug',
        'days' => 7,
        'permission' => 0664,
    ],

Не нужно жонглировать Monolog в сценарии начальной загрузки.

В частности, поддержка была добавлена ​​в https://github.com/laravel/framework/commit/4d31633dca9594c9121afbbaa0190210de28fed8 .


9
это должно быть в официальном документе!
odupont

3
В этом ответе отсутствуют апострофы. Это должно быть 'permission' => '0664'. Тогда этот ответ прекрасен!
Фил

2
@Phil Нет - это просто оболочка для обработчика потока Monologs, которая принимает int для разрешений. Monolog обертывает php.net/manual/en/function.chmod.php - обратите внимание, что ведущий 0 требуется, чтобы убедиться, что это восьмеричное значение
Крис

8
'permission' => 0664у меня работает (без кавычек)
Syclone

2
@Friedrich, если ваш файл журнала создается с «root» в качестве владельца файла, это, вероятно, означает, что у вас есть более
серьезные

62

Для Laravel 5.1 я использую следующее внизу bootstrap/app.php(как указано в документации ):

/**
 * Configure Monolog.
 */
$app->configureMonologUsing(function(Monolog\Logger $monolog) {
    $filename = storage_path('logs/laravel-'.php_sapi_name().'.log');
    $handler = new Monolog\Handler\RotatingFileHandler($filename);
    $monolog->pushHandler($handler);
});

Конечно, вы можете использовать множество других обработчиков.


1
Мне очень нравится этот ответ, потому что 1) он обновлен до версии 5.1 и 2) использует метод в документации для расширения поведения журнала.
Дилан Пирс,

Отлично, дополнительная передняя вспышка не нужна, но все равно работает. Он должен читать ... $ filename = storage_path ('logs / laravel -'. Php_sapi_name (). '. Log');
Эндрю

Могу ли я предложить использовать оба имени пользователя, выполняющего сценарий, и php_sapi_name в комбинации, поскольку многие пользователи могут запускать Laravel из интерфейса командной строки, например, несколько администраторов баз данных получают доступ к вашему серверу, или вы можете захотеть, чтобы Laravel CRON запускался как apache. получить имя процесса, выполняющего этот сценарий, используя posix_getpwuid (posix_geteuid ()) ['name']; Смотрите мой полный пост ниже.
Эндрю

1
Как использовать это в Laravel 5.6? Потому что Laravel 5.6 имеет совершенно новую систему ведения журналов.
Хамед Камрава

26

Для таких целей вы должны использовать расширенный ACL для ваших файлов и каталогов. setfaclбыл бы ваш ответ здесь. Если вы хотите предоставить пользователю www-data права на запись в файлы root в определенном каталоге, вы можете сделать это следующим образом:

setfacl -d -m default:www-data:you-chosen-group:rwx /my/folder

После выдачи этого вы устанавливаете разрешения rwxдля пользователя www-data для всех файлов /my/folder/независимо от того, кто их создал. Пожалуйста, прочтите этот и этот вопрос для справки. Кроме того, вы можете проверить документы дляsetfacl .

Позвольте мне знать, если это помогает.


3
У меня сработала следующая команда: setfacl -d -m g:www-data:rw /full/path/to/laravel/storage/logsа затем php artisan cache:clearи composer dump-autoload.
Sawny 05

17

У меня это сработало очень просто:

Я столкнулся с той же проблемой на Laravel 5.6

В config/logging.phpя только что обновил ежедневное значение пути канала php_sapi_name().

Это создает отдельный каталог для разных php_sapi_name и помещает файл журнала с отметкой времени в соответствующий каталог.

'daily' => [
            'driver' => 'daily',
            'path' => storage_path('logs/' . php_sapi_name() . '/laravel.log'),
            'level' => 'debug',
            'days' => 7,
        ]

Так что для меня

  • Файлы fpm-fcgiжурналов создаются в каталоге: Журналы с веб-сайта,owner: www-data
  • Файлы журнала создаются в cliкаталоге: из команды artisan (cronjob).owner: root

Дополнительная информация о ведении журнала Laravel 5.6: https://laravel.com/docs/5.6/logging

Вот мой config/logging.phpфайл:

<?php

return [
    /*
    |--------------------------------------------------------------------------
    | Default Log Channel
    |--------------------------------------------------------------------------
    |
    | This option defines the default log channel that gets used when writing
    | messages to the logs. The name specified in this option should match
    | one of the channels defined in the "channels" configuration array.
    |
    */
    'default' => env('LOG_CHANNEL', 'stack'),
    /*
    |--------------------------------------------------------------------------
    | Log Channels
    |--------------------------------------------------------------------------
    |
    | Here you may configure the log channels for your application. Out of
    | the box, Laravel uses the Monolog PHP logging library. This gives
    | you a variety of powerful log handlers / formatters to utilize.
    |
    | Available Drivers: "single", "daily", "slack", "syslog",
    |                    "errorlog", "custom", "stack"
    |
    */
    'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['daily'],
        ],
        'single' => [
            'driver' => 'single',
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
        ],
        'daily' => [
            'driver' => 'daily',
            'path' => storage_path('logs/' . php_sapi_name() . '/laravel.log'),
            'level' => 'debug',
            'days' => 7,
        ],
        'slack' => [
            'driver' => 'slack',
            'url' => env('LOG_SLACK_WEBHOOK_URL'),
            'username' => 'Laravel Log',
            'level' => 'critical',
        ],
        'syslog' => [
            'driver' => 'syslog',
            'level' => 'debug',
        ],
        'errorlog' => [
            'driver' => 'errorlog',
            'level' => 'debug',
        ],
    ],
];

хорошо ... твое решение чище .. я тестирую его сейчас
Сина Миандашти

1
Как было указано в другом комментарии, журналы - это только часть истории. Существуют скомпилированные представления, кеши данных, предварительно кэшированный исходный код, любой из которых может быть создан как локальные файлы либо веб-сайтом, либо пользователем cli.
Джейсон

2
Это не сработает, если вы кэшируете конфигурацию с помощью artisan config:cache, так как он создаст кеш конфигурации с использованием cli SAPI, который будет использоваться как для CLI, так и для веб-запросов.
leeb 03

1
Это работает для меня, пробовал get_current_userне работает, но php_sapi_nameработает (хотя кажется уродливее)
Ричард Фу

Я считаю, что это самый быстрый и лучший способ. Изменение конфигурации не изменяет базовую структуру Laravel, только конфигурацию.
Уильям Пригол Лопес,

13

Для меня эта проблема была намного больше, чем права доступа к журналу ... У меня были проблемы со всем, что связано с папками начальной загрузки / кеша и хранилища, где один пользователь создавал файл / папку, а другой не мог редактировать / удалять из-за стандарта 644 и 755 разрешений.

Типичные сценарии:

  • Файл bootstrap / cache / compiled.php создается пользователем apache, но не редактируется пользователем-композитором при выполнении команды установки композитора.

  • Пользователь apache создает кеш, который нельзя очистить с помощью пользователя-композитора

  • Ужасные условия гонки бревен, описанные выше.

Мечта состоит в том, что независимо от того, какой пользователь создает файл / папку, другие пользователи, которым требуется доступ, имеют точно такие же права, как и исходный автор.

TL; DR?

Вот как это делается.

Нам нужно создать общую группу пользователей под названием laravel, группа состоит из всех пользователей, которым нужен доступ к каталогам хранилища и начальной загрузки / кеша. Затем нам нужно убедиться, что вновь созданные файлы и папки имеют разрешения группы laravel и 664 и 775 соответственно.

Это легко сделать для существующих файлов / каталогов, но нужно немного волшебства, чтобы настроить правила создания файлов / папок по умолчанию ...

## create user group
sudo groupadd laravel

## add composer user to group
sudo gpasswd -a composer-user laravel

## add web server to group
sudo gpasswd -a apache laravel

## jump to laravel path
sudo cd /path/to/your/beautiful/laravel-application

## optional: temporary disable any daemons that may read/write files/folders
## For example Apache & Queues

## optional: if you've been playing around with permissions
## consider resetting all files and directories to the default
sudo find ./ -type d -exec chmod 755 {} \;
sudo find ./ -type f -exec chmod 644 {} \;

## give users part of the laravel group the standard RW and RWX
## permissions for the existing files and folders respectively
sudo chown -R :laravel ./storage
sudo chown -R :laravel ./bootstrap/cache
sudo find ./storage -type d -exec chmod 775 {} \;
sudo find ./bootstrap/cache -type d -exec chmod 775 {} \;
sudo find ./storage -type f -exec chmod 664 {} \;
sudo find ./bootstrap/cache -type f -exec chmod 664 {} \;


## give the newly created files/directories the group of the parent directory 
## e.g. the laravel group
sudo find ./bootstrap/cache -type d -exec chmod g+s {} \;
sudo find ./storage -type d -exec chmod g+s {} \;

## let newly created files/directories inherit the default owner 
## permissions up to maximum permission of rwx e.g. new files get 664, 
## folders get 775
sudo setfacl -R -d -m g::rwx ./storage
sudo setfacl -R -d -m g::rwx ./bootstrap/cache

## Reboot so group file permissions refresh (required on Debian and Centos)
sudo shutdown now -r

## optional: enable any daemons we disabled like Apache & Queues

Чисто для целей отладки я обнаружил, что разделение журналов на пользователей cli / web + было полезным, поэтому я немного изменил ответ Сэма Уилсона. Моим вариантом использования была очередь, запущенная под собственным пользователем, поэтому она помогала различать пользователя-композитора, использующего cli (например, модульные тесты), и демона очереди.

$app->configureMonologUsing(function(MonologLogger $monolog) {
     $processUser = posix_getpwuid(posix_geteuid());
     $processName= $processUser['name'];

     $filename = storage_path('logs/laravel-'.php_sapi_name().'-'.$processName.'.log');
     $handler = new MonologHandlerRotatingFileHandler($filename);
     $monolog->pushHandler($handler);
}); 

Это очень хорошо. Ваш configureMonologUsingкод все еще необходим после того, как вы запустите setfaclкоманды?
jeff-h

7

Laravel 5.1

В нашем случае мы хотели создать все файлы журналов, чтобы все в deployгруппе имели разрешения на чтение / запись. Поэтому нам нужно было создать все новые файлы с 0664разрешениями, а не с разрешениями по 0644умолчанию.

Мы также добавили средство форматирования, чтобы добавить новые строки для лучшей читаемости:

$app->configureMonologUsing(function(Monolog\Logger $monolog) {
    $filename = storage_path('/logs/laravel.log');
    $handler = new Monolog\Handler\RotatingFileHandler($filename, 0, \Monolog\Logger::DEBUG, true, 0664);
    $handler->setFormatter(new \Monolog\Formatter\LineFormatter(null, null, true, true));
    $monolog->pushHandler($handler);
});

Также можно объединить это с принятым ответом

$app->configureMonologUsing(function(Monolog\Logger $monolog) {
    $filename = storage_path('/logs/laravel-' . php_sapi_name() . '.log');
    $handler = new Monolog\Handler\RotatingFileHandler($filename, 0, \Monolog\Logger::DEBUG, true, 0664);
    $handler->setFormatter(new \Monolog\Formatter\LineFormatter(null, null, true, true));
    $monolog->pushHandler($handler);
});


5

Laravel 5.5

Добавьте этот код в bootstrap/app.php:

$app->configureMonologUsing(function (Monolog\Logger $monolog) {
    $filename = storage_path('logs/' . php_sapi_name() . '-' . posix_getpwuid(posix_geteuid())['name'] . '.log');
    $monolog->pushHandler($handler = new Monolog\Handler\RotatingFileHandler($filename, 30));
    $handler->setFilenameFormat('laravel-{date}-{filename}', 'Y-m-d');
    $formatter = new \Monolog\Formatter\LineFormatter(null, null, true, true);
    $formatter->includeStacktraces();
    $handler->setFormatter($formatter);
});
  • Он будет хранить такие файлы: laravel-2018-01-27-cli-raph.log и laravel-2018-01-27-fpm-cgi-raph.logчто более читабельно.
  • Новые строки сохраняются (по умолчанию поведение Laravel)
  • Работает с Laravel Log Viewer.

Laravel 5.6

Вы должны создать класс для вашего регистратора:

<?php

namespace App;

use Monolog\Logger as MonologLogger;

class Logger {
    public function __invoke(array $config)
    {
        $monolog = new MonologLogger('my-logger');
        $filename = storage_path('logs/' . php_sapi_name() . '-' . posix_getpwuid(posix_geteuid())['name'] . '.log');
        $monolog->pushHandler($handler = new \Monolog\Handler\RotatingFileHandler($filename, 30));
        $handler->setFilenameFormat('laravel-{date}-{filename}', 'Y-m-d');
        $formatter = new \Monolog\Formatter\LineFormatter(null, null, true, true);
        $formatter->includeStacktraces();
        $handler->setFormatter($formatter);
        return $monolog;
    }
}

Затем вы должны зарегистрировать его в config/logging.php:

'channels' => [
    'custom' => [
        'driver' => 'custom',
        'via' => App\Logging\CreateCustomLogger::class,
    ],
],

То же поведение, что и для 5.5:

  • Он будет хранить такие файлы: laravel-2018-01-27-cli-raph.logиlaravel-2018-01-27-fpm-cgi-raph.logчто более читабельно.
  • Новые строки сохраняются (по умолчанию поведение Laravel)
  • Работает с Laravel Log Viewer.

Лучший ответ! Престижность
Шахид Карими

4

Добавьте что-то вроде следующего в начало вашего app/start/artisan.phpфайла (это с Laravel 4):

// If effectively root, touch the log file and make sure it belongs to www-data
if (posix_geteuid() === 0) {
    $file = storage_path() . '/logs/laravel.log';
    touch($file);
    chown($file, 'www-data');
    chgrp($file, 'www-data');
    chmod($file, 0664);
}

Измените путь, если упомянутый вами ежедневный файл журнала не является стандартным файлом журнала Laravel. Вы также можете не захотеть изменять группу или устанавливать разрешения, как я делаю здесь. Вышеупомянутое устанавливает группу www-dataи устанавливает права записи группы. Затем я добавил своего обычного пользователя в www-dataгруппу, так что, выполняя команды artisan от имени моего обычного пользователя, я все еще могу писать в журнал.

Связанная с этим настройка - добавить в начало app/start/global.phpфайла следующее:

umask(0002);

Если вы делаете это chmodвыше линии становится спорным. Если umask установлен на это, любые новые файлы, которые создает PHP (и, следовательно, Laravel), будут замаскированы только для того, чтобы «другие» пользователи не имели прав на запись. Это означает, что каталоги будут начинаться как, rwxrwxr-xа файлы как rw-rw-r--. Таким образом, если www-dataзапущен PHP, любые файлы кеша и журналов, которые он создает, по умолчанию будут доступны для записи любому члену основной группы этого пользователя, а именно www-data.


4

(Laravel 5.6) Недавно я столкнулся с той же проблемой, и я просто установил запланированную команду для запуска /app/Console/Kernel.php.

$schedule->exec('chown -R www-data:www-data /var/www/**********/storage/logs')->everyMinute();

Я знаю, что это немного излишне, но работает как шарм, и с тех пор никаких проблем не возникало.


Оно работает ? Да, но это лучшая практика? Думаю, нет.
Пабло Папалардо

3

Laravel 5.4

\Log::getMonolog()->popHandler(); \Log::useDailyFiles(storage_path('/logs/laravel-').get_current_user().'.log');

добавить к bootфункции вAppServiceProvider


1

Laravel 5.8

Laravel 5.8 позволяет вам установить имя журнала в config/logging.php .

Итак, используя предыдущие ответы и комментарии, если вы хотите назвать свой журнал, используя как фактическое имя пользователя posix, так и php_sapi_name() значение, вам нужно только изменить установленное имя журнала. Использование ежедневного драйвера позволяет ротацию журналов, которая выполняется для каждой комбинации пользователь / API, что гарантирует, что журнал всегда будет вращаться учетной записью, которая может изменять журналы.

Я также добавил проверку функций posix, которые могут не существовать в вашей локальной среде, и в этом случае имя журнала просто по умолчанию соответствует стандарту.

Предполагая, что вы используете канал журнала по умолчанию «daily», вы можете изменить ключ «каналов» следующим образом:

# config/logging.php
'channels' => [
    ...
    'daily' => [
        'driver' => 'daily',
        'path'   => storage_path(
            function_exists('posix_getpwuid') 
            && function_exists('posix_geteuid')
                ? 'logs/laravel'
                    . '-' . php_sapi_name()
                    . '-' . posix_getpwuid(posix_geteuid())['name'] 
                    . '.log'
                : 'logs/laravel.log'),
        'level'  => 'debug',
        'days'   => 15,
    ],
    ...

Это приведет к имени журнала , который должен быть уникальным для каждой комбинации , такие как laravel-cli-sfscs-2019-05-15.logили в laravel-apache2handler-apache-2019-05-15.logзависимости от точки доступа.


0

Вы можете просто изменить разрешение файла журнала в своей команде artisan:

$path = storage_path('log/daily.log');
chown($path, get_current_user());

где get_current_user () вернет пользователя текущего скрипта.

Другими словами, daily.logон всегда будет www-dataего владельцем, даже если вы инициализируете скрипт как rootпользователь.


0

Если вы используете Laravel Envoyer , вот возможное исправление с помощью ACL в Linux:

1. Сначала запустите следующий сценарий с rootразрешениями на сервере:

В обоих сценариях вам нужно будет заменить переменные, как показано ниже:

  • {{MASTER_PATH}} : путь к каталогу виртуальных хостов (например, к папке>, содержащей ваше приложение (я)).
  • {{WEB_SERVER_USER}} : пользователь, которого использует ваш веб-сервер.
  • {{DEPLOYMENT_USER}} : пользователь, которым запускается ваш сценарий развертывания.
#!/bin/bash

DIRS="storage current/bootstrap/cache"
MASTER_PATH={{MASTER_PATH}}

if [ -d $MASTER_PATH ]; then 
    cd $MASTER_PATH
    for p in `ls $MASTER_PATH`; do 
        if [ -d $MASTER_PATH/$p ]; then     
        cd $MASTER_PATH/$p
            echo "Project: $p -> $MASTER_PATH/$p"
            for i in $DIRS; do 
                echo "- directory: $i" 
                if [ -d $i ]; then 
                    echo "-- checking ACL..."
                    HAS_ACL=`getfacl -p $i | grep "^user:{{WEB_SERVER_USER}}:.*w" | wc -l`
                    if [  $HAS_ACL -eq 0 ]; then 
                        echo "--- applying $i"
                        setfacl -L -R -m u:{{WEB_SERVER_USER}}:rwX -m u:{{DEPLOYMENT_USER}}:rwX $i
                        setfacl -dL -R -m u:{{WEB_SERVER_USER}}:rwX -m u:{{DEPLOYMENT_USER}}:rwX $i
                    else
                        echo "--- skipping $i"
                    fi
                fi
            done
        echo "--------------"
        fi
    done
else
    echo "No $MASTER_PATH - skipping overall"
fi

2. Настройте следующий обработчик развертывания на envoyer в разделе «Активировать новый выпуск»> «Перед этим действием».

PROJECT_DIRS="storage"
RELEASE_DIRS="bootstrap/cache"
 
cd {{ project }}
 
for i in $PROJECT_DIRS; do
  if [ -d $i ]; then
    HAS_ACL=`getfacl -p $i | grep "^user:{{WEB_SERVER_USER}}:.*w" | wc -l`
    if [  $HAS_ACL -eq 0 ]; then
      echo "ACL set for directory {{project}}/$i"
      setfacl -L -R -m u:{{WEB_SERVER_USER}}:rwX -m u:{{DEPLOYMENT_USER}}:rwX $i
      setfacl -dL -R -m u:{{WEB_SERVER_USER}}:rwX -m u:{{DEPLOYMENT_USER}}:rwX $i
    fi
  fi
done
 
cd {{ release }}
 
for i in $RELEASE_DIRS; do
  if [ -d $i ]; then
    HAS_ACL=`getfacl -p $i | grep "^user:{{WEB_SERVER_USER}}:.*w" | wc -l`
    if [  $HAS_ACL -eq 0 ]; then
      echo "ACL set for directory {{project}}/$i"
      setfacl -L -R -m u:{{WEB_SERVER_USER}}:rwX -m u:{{DEPLOYMENT_USER}}:rwX $i
      setfacl -dL -R -m u:{{WEB_SERVER_USER}}:rwX -m u:{{DEPLOYMENT_USER}}:rwX $i
    fi
  fi
done

3. Повторно разверните приложение.

Теперь разверните приложение заново, и оно должно работать в дальнейшем.

Примечание. Сценарий, определенный в 1. следует запускать каждый раз, когда вы добавляете новый проект на машину.



-1

Лучший способ, который я нашел, - это то, что fideloper предлагает http://fideloper.com/laravel-log-file-name , вы можете установить конфигурацию журнала laravel без касания класса журнала. Иметь разные имена для консольных программ и Http-программ, я думаю, это лучшее решение.


-1

Это решение определенно будет работать на Laravel V5.1 - V6.x

Причины этой ошибки:

  • В основном причина из-за проблем с разрешением
  • Переменные среды не найдены или .envфайл не найден в корневом каталоге
  • Проблема с расширениями PHP
  • Проблема с базой данных

Исправить:

  • Установите правильные разрешения:
    • Выполните эти команды (Ubuntu / Debian)
find /path/to/your/root/dir/ -type f -exec chmod 644 {} \;
find /path/to/your/root/dir/ -type d -exec chmod 755 {} \;

chown -R www-data:www-data /path/to/your/root/dir/

chgrp -R www-data storage bootstrap/cache
chmod -R ug+rwx storage bootstrap/cache
  • Если файл .env не существует, создайте его touch .envи вставьте переменные среды, а затем запустите
   php artisan key:generate
   php artisan cache:clear
   php artisan config:clear
   composer dump-autoload
   php artisan migrate //only if not already migrated
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.