Щоденний журнал Laravel створений з неправильними дозволами


112

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

Не вдалося відкрити потік: Дозвіл відхилено

Я щоразу змінюю дозволи на www-data, але хочу вирішити це, створюючи файл журналу завжди з правильними дозволами.

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

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

Будь-які пропозиції?


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

@BenHarold Дякую, ми це врахували, але я краще не залучаю більше сценаріїв.
НіРР

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

@BenHarold Знову дякую, ми також вважали, що це, мабуть, найкращий шлях, але я оновив питання, щоб пояснити, чому це теж не ідеально.
НіРР

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 .

Якщо ваш користувач root створив журнал помилок, це призведе до:storage/logs/laravel-root-2015-4-27.log .

Рішення №2:

Змініть журнал, який використовується командою ремісників, у вашому 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: Як вказував Jason, get_current_user()повертає ім'я власника сценарію. Отже, щоб застосувати рішення №1, chownваш клас ремісничих файлів подає на потрібне ім'я користувача.


12
Зверніть увагу, що get_current_user()повертає власника поточного сценарію PHP (згідно з php.net), а не користувача, який в даний час виконує сценарій. Я використовую php_sapi_name()натомість, який дає ім'я обробника php (наприклад, apache або cli), який, як правило, запускається як різні користувачі.
Джейсон

1
Чи можу я запропонувати використовувати ім’я обох користувачів, виконуючи скрипт та php_sapi_name у поєднанні, оскільки це можливо багатьом користувачам виконувати Laravel з CLI, наприклад, кілька DBA отримують доступ до вашого сервера або ви можете хочете, щоб Laravel CRON запускався як apache.You can отримати ім'я процесу, що виконує цей скрипт, використовуючи posix_getpwuid (posix_geteuid ()) ['ім'я']; Дивіться мою повну публікацію нижче.
Андрій

Це потрібно оновити для останніх версій Laravel: v5 +
Ендрю

106

Версія 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
апострофи відсутні у цій відповіді. Це має бути "дозвіл" => "0664". Тоді ця відповідь ідеально чудова!
Філ

2
@Phil Nope - це просто обгортка для обробника потоків Monologs, яка приймає int для дозволів. Monolog обгортає php.net/manual/en/function.chmod.php - зауважте, що для того, щоб це було вісімкове значення, потрібен провідний 0
Кріс

7
'permission' => 0664працює для мене (без лапок)
Syclone

2
@Friedrich, якщо ваш файл журналу створюється з "root" як власником файлу, це, ймовірно, сигналізує про те, що у вас є більші проблеми щодо налаштування вашого веб-сервера
kjones

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 з CLI, наприклад, кілька DBA отримують доступ до вашого сервера або ви можете хочете, щоб Laravel CRON запускався як apache.You can отримати ім'я процесу, що виконує цей скрипт, використовуючи posix_getpwuid (posix_geteuid ()) ['ім'я']; Дивіться мою повну публікацію нижче.
Андрій

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

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',
        ],
    ],
];

приємно ... ур рішення чистіше .. я тестую його зараз
Sina Miandashti

1
Як було зазначено в іншому коментарі, журнали - це лише частина історії. Існують складені представлення даних, кеші даних, попередньо кешований вихідний код, будь-який з яких я можу створити як локальні файли або в Інтернеті, або у користувача кліпу.
Джейсон

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

1
Це працює для мене, спробував get_current_userне працює, але все-таки php_sapi_nameпрацює (хоча це виглядає потворніше)
Річард Фу

Я думаю, що це найшвидший і найкращий спосіб. Змінення конфігурації не змінює базову структуру Laravel, а лише конфігурацію.
Вільям Пригол Лопес

12

Для мене ця проблема була набагато більше, ніж дозволи дозволу на журнал ... У мене виникли проблеми з будь-чим, пов’язаним із завантажувальним / кеш-пам’яттю та папками зберігання, де один користувач створив би файл / папку, а інший не зміг би редагувати / видаляти через стандарт 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 + було вигідним, тому я трохи змінив відповідь Сема Вілсона. Моїм випадком використання стала черга, що пролягала під її власним користувачем, тому вона допомогла розрізнити користувача-композитора за допомогою кліпу (наприклад, тестові одиниці) та демона черги.

$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);
});

6

Один із способів, що не стосуються Laravel, зробити цю роботу - це просто виконати свою роботу, як www-дані.

наприклад /ubuntu/189189/how-to-run-crontab-as-userwww-data

/etc/crontab

*/5 * * * * www-data php /var/www/public/voto_m/artisan top >/dev/null 2>&1


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

Найкраща відповідь! Kudos
Шахід Карімі

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 групи, щоб виконувати команди ремісників, як мій звичайний користувач, все ще може писати у журнал.

Пов’язане налаштування - це поставити наступне на початку вашого 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, які можуть не існувати у вашому локальному середовищі, і в такому випадку ім'я журналу просто за замовчуванням стандартне.

Припустимо, що ви використовуєте канал журналу за замовчуванням "щоденний", ви можете змінити клавішу "каналів" так:

# 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

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

$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. Встановіть наступний гак розгортання на посланника в розділі "Активувати новий випуск"> "Перед цією дією

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 без сенсорного класу Log. Як я вважаю, є різні назви програм для консолей та програм 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.