誤った権限で作成されたLaravel日次ログ


112

私はphp artisanを使用して(rootユーザーで)実行するスクリプトを持っています。これにより、Apache www-dataユーザーが実行する前に日次ログファイルが作成されることがあります。つまり、実際のユーザーがWebアプリケーションを使用すると、フォルダー権限エラー:

ストリームを開けませんでした:権限が拒否されました

毎回パーミッションをwww-dataに戻しますが、常に正しいパーミッションでログファイルを作成することでこれを解決したいと思います。

私は、ファイルを作成したり、ファイルに触れたりして、適切な権限が毎日あることを確認するcronジョブを作成することを検討しましたが、別のスクリプトに依存しないより良いソリューションを探しています。

また、php artisanを別のスクリプトでラップして、常にwww-data資格情報で実行されるようにすることも検討しましたが、実際に実行したいのは、Apacheに許可されていないルートプロシージャです。

他に提案はありますか?


毎日午前0時に新しいログファイルにcronジョブをセットアップしますtouch(もちろん、正しいユーザーのもとで)。
ベンハロルド

@BenHaroldありがとう、私たちはそれを考慮しましたが、私はむしろそれ以上のスクリプトを必要としないでしょう。
NiRR 2014

2
その場合はphp artisan、ログファイルを作成するユーザーとして実行する必要があります。
ベンハロルド

@BenHarold再びありがとうございます。これもおそらく最善の方法であると考えましたが、これも理想的でない理由を説明するために質問を更新しました。
NiRR 2014

2
私にとってうまくいったのは、www-dataユーザーとしてcronを実行することでしたsudo crontab -u www-data -e
Nil Llisterri

回答:


67

定数とは何かから始めましょう。

あなたはphp artisanで実行するコマンドを持っていrootます。

このコマンドは毎日実行されると想定しても安全です。

ソリューションNo 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

ソリューションNo 2:

PHPスクリプトで、artisanコマンドが使用するログを変更します。

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は、ユーザーごとにログを示し、エラーが発生しないことを考えると、より適切です。

編集:jasonが指摘したようにget_current_user()、スクリプトの所有者名を返します。したがって、ソリューションno.1を適用するにはchown、職人クラスファイルを必要なユーザー名に設定します。


12
get_current_user()は、現在スクリプトを実行しているユーザーではなく、現在のPHPスクリプト(php.netによる)の所有者を返すことに注意してください。私はphp_sapi_name()代わりに使用します。これは、異なるユーザーとして実行される傾向があるphpハンドラー(たとえば、apacheまたはcli)の名前を示します。
Jason

1
スクリプトを実行するユーザー名とphp_sapi_nameを組み合わせて使用​​することを提案できますか?多くのユーザーがCLIからLaravelを実行できるため、たとえば、数人のDBAがサーバーにアクセスしたり、Laravel CRONをApacheとして実行したりできます。 posix_getpwuid(posix_geteuid())['name']を使用してこのスクリプトを実行するプロセス名を取得します。以下の私の完全な投稿を参照してください。
Andrew

これは最新のLaravelバージョンに更新する必要があります:v5 +
Andrew

105

Laravelバージョン5.6.10以降では、およびドライバーのpermission構成(config/logging.php)の要素がサポートされています。singledaily

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

ブートストラップスクリプトでMonologを操作する必要はありません。

具体的には、https://github.com/laravel/framework/commit/4d31633dca9594c9121afbbaa0190210de28fed8にサポートが追加されました。


8
これは公式ドキュメントにあるはずです!
odupont 2018年

3
この回答ではアポストロフィが欠落しています。'permission' => '0664'である必要があります。その後、この答えは完全にうまくいきます!
Phil

2
@Phil Nope-これは、権限のintを受け入れるMonologsストリームハンドラのラッパーにすぎません。モノローグラップphp.net/manual/en/function.chmod.php -先頭の0は、それが8進数値であることを確認するために必要とされることに注意してください
クリス・

7
'permission' => 0664私のために働く(引用符なし)
Syclone

2
@Friedrichあなたのログファイルは、ファイルの所有者として「ルート」で作成されている場合、あなたがあなたのウェブサーバを設置しているかという点で大きな問題を抱えている可能性が高い信号
kjones

62

Laravel 5.1の場合、bootstrap/app.phpdocsで言及されいるように)下部にある次のものを使用します。

/**
 * 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');
Andrew

スクリプトを実行するユーザー名とphp_sapi_nameを組み合わせて使用​​することを提案できますか?多くのユーザーがCLIからLaravelを実行できるため、たとえば、数人のDBAがサーバーにアクセスしたり、Laravel CRONをApacheとして実行したりできます。 posix_getpwuid(posix_geteuid())['name']を使用してこのスクリプトを実行するプロセス名を取得します。以下の私の完全な投稿を参照してください。
Andrew

1
Laravel 5.6での使用方法 Laravel 5.6には最新のロギングシステムがあるからです。
Hamed Kamrava、2018年

26

このような目的のために、ファイルとディレクトリに高度なACLを使用する必要があります。setfaclここであなたの答えになります。特定のディレクトリにあるルートのファイルに書き込むためのアクセス権をwww-dataユーザーに与えたい場合は、次のように行うことができます。

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

いい…urソリューションはよりクリーンである..試してみる
みる Sina Miandashti

1
別のコメントで指摘されているように、ログはストーリーの一部にすぎません。コンパイルされたビュー、データキャッシュ、事前にキャッシュされたソースコードがあり、Webまたはcliユーザーがローカルファイルとして作成できます。
ジェイソン

2
これはartisan config:cache、CLIとWeb要求の両方に使用されるcli SAPIを使用して構成キャッシュを作成するため、を使用して構成をキャッシュする場合は機能しません。
リーブ

1
これは私にとっては機能しますが、試しget_current_userても機能しませんが、機能しますphp_sapi_name(醜く見えます)
Richard Fu

これが最速かつ最良の方法だと思います。構成を変更しても、Laravelの基本構造は変更されません。構成だけが変更されます。
William Prigol Lopes

12

私にとって、この問題はログの権限以上のものでした...ブートストラップ/キャッシュおよびストレージフォルダーに関連する問題があり、1人のユーザーがファイル/フォルダーを作成し、もう1人は標準により編集/削除できませんでした644および755権限。

一般的なシナリオは次のとおりです。

  • Apacheユーザーが作成したbootstrap / cache / compiled.phpファイルが、composer installコマンドを実行するときにcomposerユーザーが編集できない

  • composerユーザーを使用してクリアできないキャッシュを作成している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 +ユーザーの両方に分割することが有益であることがわかったので、Sam Wilsonの回答を少し変更しました。私のユースケースは、キューが自身のユーザーの下で実行されていたため、cli(例:単体テスト)を使用するcomposerユーザーとキューデーモンを区別するのに役立ちました。

$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 2017

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.loglaravel-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.loglaravel-2018-01-27-fpm-cgi-raph.log読みやすくなります。
  • 新しい行が保持されます(デフォルトのLaravel動作時)
  • Laravel Log Viewerで動作します

ベストアンサー!功績
Shahid Karimi

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を実行している場合、PHPが作成するすべてのキャッシュおよびログファイルは、デフォルトで、そのユーザーのメイングループのすべてのユーザーが書き込み可能になりますwww-data


4

(Laravel 5.6)最近同じ問題が発生し、スケジュールされたコマンドをで実行するように設定しました/app/Console/Kernel.php

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

少しやり過ぎだと思いますが、それは魅力のように機能し、それ以来何の問題もありませんでした。


できます ?うん、でもベストプラクティスは?私はそうは思いません。
Pablo Papalardo

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」を使用していると仮定すると、「channels」キーを次のように変更できます。

# 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を使用している場合、LinuxでACLを使用して可能な修正は次のとおりです。

1.最初rootに、サーバーに対する権限を使用して次のスクリプトを実行します。

どちらのスクリプトでも、以下の指示に従って変数を置き換える必要があります。

  • {{MASTER_PATH}}:仮想ホストディレクトリへのパス(例:フォルダ>アプリケーションを含む)。
  • {{WEB_SERVER_USER}}:Webサーバーが使用するユーザー。
  • {{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で、タッチLogクラスなしで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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.