잘못된 권한으로 생성 된 Laravel 일일 로그


112

php artisan ( 루트 사용자 포함)을 사용하여 실행하는 스크립트가 있으며 때로는 apache www-data 사용자가 수행 하기 전에 일일 로그 파일이 생성 됩니다. 즉, 실제 사용자가 내 웹 응용 프로그램을 사용할 때 폴더 권한 오류 :

스트림을 열지 못했습니다. 권한이 거부되었습니다.

매번 권한을 www-data로 다시 변경 하지만 항상 올바른 권한으로 로그 파일을 생성하여이 문제를 해결하고 싶습니다.

파일을 생성하거나 매일 올바른 권한이 있는지 확인하기 위해 파일을 만지는 크론 작업을 만드는 것을 고려했지만 다른 스크립트에 의존하지 않는 더 나은 솔루션을 찾고 있습니다.

우리는 또한 php artisan을 다른 스크립트에 래핑하여 항상 www-data 자격 증명으로 실행되도록 하는 것을 고려했지만 우리가 원하는 것은 실제로 아파치가 허용해서는 안되는 루트 프로 시저입니다.

더 많은 제안이 있습니까?


매일 자정에 새 로그 파일에 cron작업을 설정합니다 touch(물론 올바른 사용자 아래).
Ben Harold

@BenHarold 감사합니다, 우리는 그것을 고려했지만 더 많은 스크립트를 포함하지 않을 것입니다.
NiRR

2
이 경우 php artisan로그 파일을 만들려는 사용자 로 실행해야 합니다.
Ben Harold

@BenHarold 다시 한 번 감사드립니다. 우리는 아마도 가장 좋은 방법 일 것입니다. 그러나 이것이 왜 이상적이지 않은지 설명하기 위해 질문을 업데이트했습니다.
NiRR

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.

해결 방법 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()스크립트의 소유자 이름을 반환합니다. 따라서 1 번 솔루션을 적용 chown하려면 필요한 사용자 이름에 장인 클래스 파일을 입력해야합니다.


12
get_current_user()현재 스크립트를 실행중인 사용자가 아닌 현재 PHP 스크립트 (php.net에 따라)의 소유자 를 반환합니다 . 내가 사용하는 php_sapi_name()다른 사용자로 실행하는 경향이있는 PHP 처리기 (예를 들어 아파치 또는 CLI)의 이름을 제공하는 대신.
Jason

1
많은 사용자가 CLI에서 Laravel을 실행할 수 있으므로 스크립트를 실행하는 사용자 이름과 php_sapi_name을 함께 사용하도록 제안 할 수 있습니까? posix_getpwuid (posix_geteuid ()) [ 'name']을 사용하여이 스크립트를 실행하는 프로세스 이름을 가져옵니다. 아래 내 전체 게시물을 참조하십시오.
Andrew

이 요구는 최신 Laravel 버전의 업데이트 할 : V5 +
앤드류

106

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에 지원이 추가되었습니다 .


9
이것은 공식 문서에 있어야합니다!
odupont

3
이 답변에는 아포스트로피가 없습니다. '권한'=> '0664'여야합니다. 그렇다면이 대답은 완벽합니다!
Phil

2
@Phil Nope-이것은 권한에 대한 int를 허용하는 Monologs 스트림 핸들러의 래퍼입니다. 독백 랩 php.net/manual/en/function.chmod.php - 선도적 인 0을 만들기 위해 필요하다는 것을 참고하십시오 8 진수 값입니다
크리스

7
'permission' => 0664나를 위해 작동합니다 (따옴표없이)
Syclone

2
@Friedrich 로그 파일이 파일의 소유자 인 'root'를 사용하여 생성되는 경우 웹 서버 설정 방법과 관련하여 더 큰 문제가 있다는 신호일 가능성이 높습니다
kjones 19

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) 로그 동작을 확장하기 위해 문서의 메서드를 사용하기 때문에이 답변이 정말 마음에 듭니다.
Dylan Pierce

훌륭합니다. 추가 전방 플래시는 필요하지 않지만 여전히 작동합니다. 읽어야합니다 ... $ filename = storage_path ( 'logs / laravel-'. php_sapi_name (). '. log');
앤드류

많은 사용자가 CLI에서 Laravel을 실행할 수 있으므로 스크립트를 실행하는 사용자 이름과 php_sapi_name을 함께 사용하도록 제안 할 수 있습니까? posix_getpwuid (posix_geteuid ()) [ 'name']을 사용하여이 스크립트를 실행하는 프로세스 이름을 가져옵니다. 아래 내 전체 게시물을 참조하십시오.
Andrew

1
Laravel 5.6에서 어떻게 사용합니까? Laravel 5.6에는 새로운 로깅 시스템이 있기 때문입니다.
Hamed Kamrava

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
  • 로그 파일은 cliartisan 명령 (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 솔루션은 .. 깨끗 메신저 지금 테스트
시나 Miandashti

1
다른 의견에서 지적했듯이 로그는 이야기의 일부일뿐입니다. 컴파일 된 뷰, 데이터 캐시, 미리 캐시 된 소스 코드가 있으며, 웹 또는 cli 사용자가 로컬 파일로 생성 한 모든 코드가 있습니다.
Jason

2
artisan config:cache을 사용하여 구성을 캐시하면 CLI 및 웹 요청에 모두 사용되는 cli SAPI를 사용하여 구성 캐시를 생성하므로 작동하지 않습니다 .
leeb

1
시도 나에게이 작품은, get_current_user하지 작업을 수행하지만, php_sapi_name(그것은 추악한 보이더라도) 일을
리처드 푸

이것이 가장 빠르고 최선의 방법이라고 생각합니다. 구성을 수정하는 것은 라 라벨의 기본 구조를 수정하는 것이 아니라 구성 만 수정하는 것입니다.
William Prigol Lopes

12

나 에게이 문제는 로그 권한 이상이었습니다 ... 한 사용자가 파일 / 폴더를 만들고 다른 사용자가 표준으로 인해 편집 / 삭제할 수없는 부트 스트랩 / 캐시 및 저장소 폴더와 관련된 문제가있었습니다. 644 및 755 권한.

일반적인 시나리오는 다음과 같습니다.

  • apache 사용자가 생성하지만 composer 설치 명령을 수행 할 때 composer 사용자가 편집 할 수없는 bootstrap / cache / compiled.php 파일

  • 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 (예 : 단위 테스트)를 사용하는 작곡가 사용자와 대기열 데몬을 구별하는 데 도움이되었습니다.

$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

라 라벨 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

라 라벨 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 와 함께 작동합니다.

라 라벨 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 와 함께 작동합니다.

베스트 답변! 좋아요
Shahid Karimi

4

app/start/artisan.php파일 시작 부분에 다음과 같은 내용을 추가 합니다 (라 라벨 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) 최근에 동일한 문제가 발생하여 .NET에서 실행되도록 예약 된 명령을 설정했습니다 /app/Console/Kernel.php.

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

나는 그것이 약간 과잉이라는 것을 알고 있지만 그것은 매력처럼 작동하며 그 이후로 아무런 문제가 없었습니다.


효과가있다 ? 네,하지만 모범 사례입니까? 나는 그렇게 생각하지 않는다.
Pablo Papalardo

3

라 라벨 5.4

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

boot기능에 추가AppServiceProvider


1

라 라벨 5.8

Laravel 5.8에서는 로그 이름을 설정할 수 있습니다. config/logging.php .

따라서 이전 답변과 의견을 사용하여 이름을 지정하려면 실제 posix 사용자 이름과 php_sapi_name() 값 하여 로그에 이름을 지정하려면 로그 이름 세트 만 변경하면됩니다. 일일 드라이버를 사용하면 로그를 수정할 수있는 계정에 의해 항상 로그가 회전되도록 사용자 / api 조합별로 실행되는 로그 회전이 가능합니다.

또한 로컬 환경에 없을 수있는 posix 함수에 대한 검사를 추가했습니다.이 경우 로그 이름은 기본적으로 표준으로 설정됩니다.

기본 로그 채널 '매일'을 사용한다고 가정하면 다음과 같이 '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}} : 웹 서버가 사용하는 사용자입니다.
  • {{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. "Activate New Release"> "Before This Action"에서 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을 제안한다는 것 입니다. 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.