Yanlış izinlerle oluşturulan Laravel günlük kaydı


112

Php artisan ( kök kullanıcıyla) kullanarak çalıştırdığım bir komut dosyam var ve bazen günlük günlük dosyasının apache www-data kullanıcısından önce oluşturulmasına neden oluyor - yani gerçek bir kullanıcı web uygulamamı kullandığında klasör izin hatası:

Akış açılamadı: İzin reddedildi

İzinleri her zaman tekrar www-data olarak değiştiriyorum, ancak bunu günlük dosyasının her zaman doğru izinlerle oluşturulmasını sağlayarak çözmek istiyorum.

Dosyayı oluşturan veya her gün doğru izne sahip olduğundan emin olmak için ona dokunan bir cron işi oluşturmayı düşündüm, ancak başka bir betiğe dayanmayan daha iyi bir çözüm arıyorum.

Ayrıca, her zaman www-veri kimlik bilgileriyle çalıştığından emin olmak için php artisan'ı başka bir komut dosyasına sarmayı düşündük , ancak yapmak istediğimiz bazı şeyler aslında root apache'nin yapmasına izin verilmemesi gereken prosedürleridir.

Başka öneriniz var mı?


Her gün gece yarısı yeni bir günlük dosyasına bir crontouchkurun (tabii ki doğru kullanıcı altında).
Ben Harold

@BenHarold Teşekkürler, bunu düşündük ama daha fazla senaryo içermemeyi tercih ederim.
NiRR

2
Bu durumda php artisan, günlük dosyasını oluşturmak istediğiniz kullanıcı olarak çalıştırmanız gerekir .
Ben Harold

@BenHarold Tekrar teşekkürler, bunu da düşündük, muhtemelen en iyi yol budur, ancak bunun neden ideal olmadığını açıklamak için soruyu güncelledim.
NiRR

2
Benim için işe sudo crontab -u www-data -e
yarayan

Yanıtlar:


67

Sabit olanla başlayalım.

Bir php artisankomutunuz var, çalıştıranroot .

Bu komutun günlük olarak yürütüldüğünü varsaymak güvenlidir.

Çözüm No 1:

Dosyaları oluşturan kullanıcının varsayılan olarak ona yazma iznine sahip olduğu göz önüne alındığında, günlükleri kullanıcıya göre ayırabiliriz:

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');

Senin Eğer www-data kullanıcı bir hata günlüğü oluşturmak olduğunu, bu neden olacaktır:storage/logs/laravel-www-data-2015-4-27.log .

Senin Eğer kök kullanıcı bir hata günlüğü oluşturmak olduğunu, bu neden olacaktır:storage/logs/laravel-root-2015-4-27.log .

Çözüm No 2:

Zanaatkar komutunuz tarafından kullanılan günlüğü php betiğinizde değiştirin.

Senin içinde run()fonksiyonu başlangıcında bu satırı ekleyin:

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

Sınıfınızın adı ise ArtisanRunner, günlük dosyanız şöyle olacaktır:

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

Sonuç: 1 numaralı çözüm, günlüklerinizi kullanıcıya göre tanımladığı için daha iyidir ve bu nedenle hiçbir hata oluşmaz.

DÜZENLEME: Jason'ın belirttiği gibi get_current_user(), betiğin sahibinin adını döndürür. Bu nedenle, 1 numaralı çözümün uygulanması için, chownzanaatkar sınıf dosyalarınız gerekli kullanıcı adına.


12
Lütfen get_current_user()şu anda komut dosyasını çalıştıran kullanıcıyı değil, mevcut PHP betiğinin sahibini (php.net'e göre) döndürdüğünü unutmayın . Bunun php_sapi_name()yerine, farklı kullanıcılar olarak çalıştırılma eğiliminde olacak php işleyicisinin adını (örneğin apache veya cli) veren kullanıyorum.
Jason

1
Hem komut dosyasını çalıştıran kullanıcı adını hem de php_sapi_name'i birlikte kullanma önerisinde bulunabilir miyim, çünkü birçok kullanıcı CLI'den Laravel'i çalıştırabilir, örneğin birkaç DBA sunucunuza erişebilir veya Laravel CRON'un apache olarak çalışmasını isteyebilirsiniz. posix_getpwuid (posix_geteuid ()) ['name'] kullanarak bu komut dosyasını çalıştıran işlem adını alın; Aşağıdaki tam yazıma bakın.
Andrew

Bunun en son Laravel sürümleri için güncellenmesi gerekiyor: v5 +
Andrew

107

Laravel 5.6.10 ve sonraki sürümleri, ve sürücü için permissionyapılandırmada ( config/logging.php) bir öğe desteğine sahiptir :singledaily

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

Önyükleme betiğinde Monolog ile oynamaya gerek yok.

Özellikle, https://github.com/laravel/framework/commit/4d31633dca9594c9121afbbaa0190210de28fed8 adresine destek eklendi .


9
bu resmi belgede olmalıdır!
odupont

3
bu yanıtta kesme işaretleri eksik. 'İzin' => '0664' olmalıdır. O halde bu cevap gayet iyi!
Phil

2
@Phil Nope - bu, izinler için int kabul eden Monologs akış işleyicisi için bir sarmalayıcıdır. Monolog, php.net/manual/en/function.chmod.php'yi sarmalar - bunun sekizlik bir değer olduğundan emin olmak için baştaki bir 0'ın gerekli olduğuna dikkat edin
Chris

7
'permission' => 0664benim için çalışıyor (alıntılar olmadan)
Syclone

2
@Friedrich Eğer günlük dosyanız dosyanın sahibi olarak 'root' ile oluşturuluyorsa, bu muhtemelen web sunucunuzun nasıl
kurulduğu

62

Laravel 5.1 için aşağıdakilerin altına doğru bootstrap/app.php( belgelerde bahsedildiği gibi ) kullanıyorum:

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

Elbette bunun yerine kullanabileceğiniz birçok başka İşleyici var.


1
Bu yanıtı gerçekten beğendim çünkü 1) 5.1'e güncellendi ve 2) günlük davranışını genişletmek için belgelerde bir yöntem kullanıyor.
Dylan Pierce

Mükemmel, ekstra ileri flaş gerekli değil ama yine de çalışıyor. $ Filename = storage_path ('günlükler / laravel -'. Php_sapi_name (). '. Log');
Andrew

Hem komut dosyasını çalıştıran kullanıcı adını hem de php_sapi_name'i birlikte kullanma önerisinde bulunabilir miyim, çünkü birçok kullanıcı CLI'den Laravel'i çalıştırabilir, örneğin birkaç DBA sunucunuza erişebilir veya Laravel CRON'un apache olarak çalışmasını isteyebilirsiniz. posix_getpwuid (posix_geteuid ()) ['name'] kullanarak bu komut dosyasını çalıştıran işlem adını alın; Aşağıdaki tam yazıma bakın.
Andrew

1
Laravel 5.6'da nasıl kullanılır? Çünkü Laravel 5.6 yepyeni bir Loglama sistemine sahip.
Hamed Kamrava

26

Bu tür amaçlar için dosyalarınızda ve dizinlerinizde gelişmiş ACL kullanmalısınız. setfaclcevabınız burada olacaktır. Eğer vermek istiyorsanız www-data üzerinde yazma için kullanıcı izinleri root belirli bir dizindeki dosyaları, bunu şöyle yapabilirsiniz:

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

Bunu yayınladıktan sonra, kimin oluşturduğuna bakılmaksızın tüm dosyalarda www-data kullanıcısı rwxiçin izinler ayarlıyorsunuz . Lütfen referans için buna ve bu soruya bakın. Ayrıca, dokümanları kontrol edebilirsiniz ./my/folder/setfacl .

Bunun yardımcı olup olmadığını bana bildirin.


3
Aşağıdaki komut benim için çalıştı: setfacl -d -m g:www-data:rw /full/path/to/laravel/storage/logsardından php artisan cache:clearve composer dump-autoload.
Sawny

17

Bunu çok basit bir şekilde çalıştırdım:

Aynı problemle karşılaştım Laravel 5.6'da

Gelen config/logging.phpSadece günlük kanalın yolu değerini güncellenmişphp_sapi_name() .

Bu, farklı php_sapi_name için ayrı bir kayıt oluşturur ve zaman damgasını içeren günlük dosyasını kendi pertiküler dizinine koyar.

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

Yani benim için

  • Günlük dosyaları altında oluşturulur fpm-fcgi dizinde : Web sitesinden günlükler,owner: www-data
  • Günlük dosyaları cli, artisan komutundan (cronjob) dizin altında oluşturulur .owner: root

Laravel 5.6 günlük kaydı hakkında daha fazla bilgi: https://laravel.com/docs/5.6/logging

İşte config/logging.phpdosyam:

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

güzel ... ur çözüm daha temiz .. şimdi test
ediyorum

1
Başka bir yorumda da belirtildiği gibi, günlükler hikayenin yalnızca bir parçasıdır. Web veya cli kullanıcısı tarafından yerel dosyalar olarak oluşturulabilecek derlenmiş görünümler, veri önbellekleri, önbelleğe alınmış kaynak kodu vardır.
Jason

2
Yapılandırmayı kullanarak önbelleğe alırsanız bu işe yaramaz artisan config:cache, çünkü hem CLI hem de web istekleri için kullanılacak olan CLİ SAPI'yi kullanarak bir yapılandırma önbelleği oluşturur.
leeb

1
Denenmiş benim için bu eserler get_current_userdeğil çalışır, ancak php_sapi_name(o çirkin görünse de) işi
Richard Fu

Bence bu en hızlı ve en iyi yol. Yapılandırmayı değiştirmek, Laravel'in temel yapısını değiştirmez, sadece yapılandırma.
William Prigol Lopes

12

Benim için bu sorun, günlük izinlerinden çok daha fazlasıydı ... Önyükleme / önbellek ve depolama klasörleriyle ilgili herhangi bir sorun yaşadım, burada bir kullanıcı bir dosya / klasör oluşturacak ve diğer kullanıcı standart nedeniyle düzenleyemeyecek / silemeyecek. 644 ve 755 izinleri.

Tipik senaryolar şunlardır:

  • Apache kullanıcısı tarafından oluşturulan ancak composer yükleme komutunu gerçekleştirirken composer kullanıcısı tarafından düzenlenemeyen bootstrap / cache / compiled.php dosyası

  • Composer kullanıcısı kullanılarak temizlenemeyen önbellek oluşturan apache kullanıcısı

  • Yukarıda açıklanan korkunç günlük yarış koşulları.

Buradaki rüya, dosyayı / klasörü hangi kullanıcı yaratırsa yaratsın, erişmesi gereken diğer kullanıcıların orijinal yazarla tam olarak aynı izinlere sahip olmasıdır.

TL; DR?

İşte nasıl yapıldığı.

Laravel adında paylaşılan bir kullanıcı grubu oluşturmamız gerekiyor, grup depolama ve önyükleme / önbellek dizinlerine erişmesi gereken tüm kullanıcılardan oluşuyor. Daha sonra, yeni oluşturulan dosya ve klasörlerin sırasıyla laravel grubuna ve 664 ve 775 izinlerine sahip olduğundan emin olmamız gerekir.

Bunu mevcut dosyalar / dizinler için yapmak kolaydır, ancak varsayılan dosya / klasör oluşturma kurallarını değiştirmek için biraz sihre ihtiyaç vardır ...

## 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

Tamamen hata ayıklama amacıyla günlükleri hem cli / web + kullanıcılarına bölmenin yararlı olduğunu gördüm, bu yüzden Sam Wilson'ın cevabını biraz değiştirdim. Benim kullanım durumum kuyruğun kendi kullanıcısı altında çalışmasıydı, bu yüzden cli kullanan besteci kullanıcısı (örneğin birim testleri) ile kuyruk arka plan programı arasında ayrım yapmaya yardımcı oldu.

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

Bu çok iyi. Sizin mi configureMonologUsing, çalıştırdığınız bir kez kod gerekli olsa da, hala setfaclkomutları?
jeff-h

7

Laravel 5.1

Bizim durumumuzda, deploygruptaki her şeyin okuma / yazma izinlerine sahip olması için tüm günlük dosyalarını oluşturmak istedik . Bu nedenle, 0664izinlere sahip tüm yeni dosyaları oluşturmamız gerekiyordu.0644 varsayılanın .

Daha iyi okunabilirlik için yeni satırlar eklemek için bir biçimlendirici de ekledik:

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

Bunu kabul edilen cevapla birleştirmek de mümkündür

$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

Bu kodu şuraya ekleyin 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);
});
  • Dosyaları şu şekilde depolar: laravel-2018-01-27-cli-raph.logve laravel-2018-01-27-fpm-cgi-raph.loghangisi daha okunabilirdir.
  • Yeni çizgiler korunur (varsayılan Laravel davranışı olarak)
  • Laravel Log Viewer ile çalışır

Laravel 5.6

Sen bir sınıf oluşturmak zorunda senin kaydedici için:

<?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;
    }
}

Ardından, kayıt olmalısınız config/logging.php:

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

5.5 ile aynı davranış:

  • Dosyaları şu şekilde depolar: laravel-2018-01-27-cli-raph.logve laravel-2018-01-27-fpm-cgi-raph.loghangisi daha okunabilirdir.
  • Yeni çizgiler korunur (varsayılan Laravel davranışı olarak)
  • Laravel Log Viewer ile çalışır

En iyi cevap! Tebrikler
Shahid Karimi

4

app/start/artisan.phpDosyanızın başlangıcına aşağıdakine benzer bir şey ekleyin (bu Laravel 4 ile):

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

Bahsettiğiniz günlük günlük dosyası standart Laravel günlük dosyası değilse yolu ayarlayın. Ayrıca, burada yaptığım gibi grubu değiştirmek veya izinleri ayarlamak istemeyebilirsiniz. Yukarıdaki, grubu olarak www-dataayarlar ve grup yazma izinlerini ayarlar. Daha sonra normal kullanıcımı www-datagruba ekledim, böylece normal kullanıcım olarak esnaf komutlarını çalıştırmaya devam ettim.

Bununla ilgili bir ince ayar, aşağıdakileri app/start/global.phpdosyanızın başına koymaktır :

umask(0002);

Bunu yaparsanız chmodyukarıdaki satır tartışmalı hale gelir. Umask değeri buna ayarlandığında, PHP'nin (ve dolayısıyla Laravel'in) yaptığı tüm yeni dosyaların izinleri yalnızca "diğer" kullanıcıların yazma izinlerine sahip olmaması için maskelenir. Bu, dizinlerin rwxrwxr-xve dosyaların olarak başlayacağı anlamına gelir rw-rw-r--. Dolayısıyla www-data, PHP çalıştırılıyorsa, yaptığı herhangi bir önbellek ve günlük dosyası, o kullanıcının ana grubundaki herhangi biri tarafından varsayılan olarak yazılabilir olacaktır, yani www-data.


4

(Laravel 5.6) Geçenlerde aynı problemle karşılaştım ve sadece programlanmış bir komutu çalıştırması için ayarladım /app/Console/Kernel.php.

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

Bunun biraz abartılı olduğunu biliyorum, ama bir cazibe gibi çalışıyor ve o zamandan beri herhangi bir sorun yaşamadım.


İşe yarıyor ? Evet, ama en iyi uygulama mı? Bence değil.
Pablo Papalardo

3

Laravel 5.4

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

bootişleve ekleAppServiceProvider


1

Laravel 5.8

Laravel 5.8, günlük adını girmenize izin verir config/logging.php.

Bu nedenle, önceki cevapları ve yorumları kullanarak, günlüğe hem gerçek posix kullanıcı adı hem de php_sapi_name()değeri kullanarak ad vermek istiyorsanız , yalnızca günlük adı kümesini değiştirmeniz gerekir. Günlük sürücünün kullanılması, günlüklerin her zaman günlükleri değiştirebilen bir hesap tarafından döndürülmesini sağlayan, kullanıcı / api kombinasyonu başına çalışan günlük rotasyonuna izin verir.

Ayrıca, yerel ortamınızda bulunmayabilecek posix işlevleri için bir kontrol ekledim, bu durumda günlük adı sadece standarttır.

Varsayılan günlük kanalını 'günlük' kullandığınızı varsayarak, 'kanallar' anahtarınızı şu şekilde değiştirebilirsiniz:

# 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,
    ],
    ...

Bu, erişim noktanız gibi laravel-cli-sfscs-2019-05-15.logveya buna laravel-apache2handler-apache-2019-05-15.logbağlı olarak her kombinasyon için benzersiz olması gereken bir günlük adı ile sonuçlanacaktır .


0

Artisan komutunuzdaki günlük dosyasının iznini basitçe değiştirebilirsiniz:

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

get_current_user () nerede betik kullanıcıyı dönecektir.

Başka bir deyişle, komut dosyasını kullanıcı olarak başlatsanız bile , daily.logher zaman www-datasahibi olacaktır root.


0

Eğer kullanıyorsanız laravel Envoyer , burada Linux ACL kullanarak olası bir düzeltmedir:

1. İlk olarak, aşağıdaki komut dosyasını rootsunucuda izinlerle çalıştırın :

Her iki komut dosyasında da değişkenleri aşağıda belirtildiği gibi değiştirmeniz gerekir:

  • {{MASTER_PATH}} : Sanal ana bilgisayar dizininizin yolu (ör. Uygulamalarınızı içeren klasör>).
  • {{WEB_SERVER_USER}} : Web sunucunuzun kullandığı kullanıcı.
  • {{DEPLOYMENT_USER}} : Dağıtım komut dosyanızın çalıştırdığı kullanıcı.
#!/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. Temsilci için "Yeni Sürümü Etkinleştir"> "Bu Eylemden Önce" altında aşağıdaki dağıtım kancasını kurun

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. Uygulamanızı yeniden dağıtın

Şimdi uygulamanızı yeniden dağıtın ve ileriye doğru çalışmalıdır.

Not: tanımlanan komut 1. Eğer makineye yeni bir proje eklemek her zaman çalıştırılmalıdır.


0
cd /path/to/project
chown -R www-data:root .
chmod -R g+s .

-1

Bulduğum en iyi yol, fideloper'ın önerdiği, http://fideloper.com/laravel-log-file-name , log sınıfına dokunmadan laravel günlük yapılandırmasını ayarlayabilirsiniz. Konsol programları ve Http programları için farklı isimlere sahip olmak, bence en iyi çözüm.


-1

Bu çözüm kesinlikle Laravel V5.1 - V6.x üzerinde çalışacaktır.

Bu hatanın nedenleri:

  • İzin sorunlarından kaynaklanan temel neden var
  • .envKök dizininizde bulunamadı veya dosya bulunamadı
  • PHP uzantıları sorunu
  • Veritabanı sorunu

Düzeltme:

  • Doğru izinleri ayarlayın:
    • Bu komutları çalıştırın (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
  • Eğer .env dosya yok, bir tane oluşturun touch .envve ortam değişkenleri yapıştırın ve sonra çalıştırın
   php artisan key:generate
   php artisan cache:clear
   php artisan config:clear
   composer dump-autoload
   php artisan migrate //only if not already migrated
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.