Log harian Laravel dibuat dengan izin yang salah

112

Saya memiliki skrip yang saya jalankan menggunakan php artisan (dengan pengguna root ), dan terkadang hal itu menyebabkan file log harian dibuat sebelum pengguna www-data apache melakukannya - yang berarti bahwa ketika pengguna sebenarnya menggunakan aplikasi web saya, saya mendapatkan kesalahan izin folder:

Gagal membuka aliran: Izin ditolak

Saya mengubah izin kembali ke www-data setiap saat tetapi saya ingin menyelesaikannya dengan membuat file log selalu dibuat dengan izin yang benar.

Saya telah mempertimbangkan untuk membuat pekerjaan cron yang membuat file atau menyentuhnya untuk memastikannya memiliki izin yang tepat setiap hari, tetapi saya mencari solusi yang lebih baik yang tidak bergantung pada skrip lain.

Kami juga mempertimbangkan untuk membungkus pengrajin php dalam skrip lain untuk memastikan bahwa itu selalu dijalankan dengan kredensial data-www , tetapi sesuatu yang ingin kami lakukan sebenarnya adalah root prosedur yang seharusnya tidak diizinkan oleh apache.

Ada saran lagi?

NiRR
sumber
Setup cronpekerjaan ke touchfile log baru pada tengah malam setiap hari (di bawah pengguna yang benar, tentu saja).
Ben Harold
@BenHarold Terima kasih, kami telah mempertimbangkannya tetapi saya lebih suka tidak melibatkan lebih banyak skrip.
NiRR
2
Dalam hal ini Anda harus menjalankan php artisansebagai pengguna yang Anda inginkan untuk membuat file log.
Ben Harold
@BenHarold Sekali lagi terima kasih, kami telah mempertimbangkannya juga, yang mungkin merupakan cara terbaik untuk melakukannya, tetapi saya telah memperbarui pertanyaan untuk menjelaskan mengapa ini juga tidak ideal.
NiRR
2
Apa yang berhasil bagi saya adalah menjalankan cron sebagai pengguna data www dengansudo crontab -u www-data -e
Nil Llisterri

Jawaban:

67

Mari kita mulai dengan apa yang konstan.

Anda memiliki php artisanperintah, dijalankan oleh root.

Aman untuk mengasumsikan bahwa perintah ini dijalankan setiap hari.

Solusi No 1:

Mengingat bahwa pengguna yang membuat file adalah pengguna yang memiliki izin untuk menulis padanya secara default, kita dapat memisahkan log oleh pengguna seperti:

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

Jika Anda www-data pengguna adalah untuk membuat log kesalahan, itu akan menghasilkan: storage/logs/laravel-www-data-2015-4-27.log.

Jika Anda akar pengguna adalah untuk membuat log kesalahan, itu akan menghasilkan: storage/logs/laravel-root-2015-4-27.log.

Solusi No 2:

Ubah log yang digunakan oleh perintah artisan Anda, di skrip php Anda.

Dalam run()fungsi Anda , tambahkan baris ini di awal:

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

Jika nama kelas Anda adalah ArtisanRunner, maka file log Anda adalah:

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

Kesimpulan: Solusi nomor 1 lebih baik, mengingat itu menggambarkan log Anda oleh pengguna, dan karenanya tidak ada kesalahan yang akan terjadi.

EDIT: Seperti yang ditunjukkan oleh jason, get_current_user()mengembalikan nama pemilik skrip. Karenanya, agar solusi no.1 dapat diterapkan, chownfile kelas artisan Anda ke nama pengguna yang diperlukan.

Mysteryos
sumber
12
Harap dicatat bahwa yang get_current_user()mengembalikan pemilik skrip PHP saat ini (menurut php.net) dan bukan pengguna yang sedang menjalankan skrip. Saya menggunakan php_sapi_name()sebagai gantinya, yang memberi nama php handler (apache atau cli, misalnya) yang cenderung dijalankan sebagai pengguna yang berbeda.
Jason
1
Dapatkah saya memberikan saran untuk menggunakan kedua nama pengguna yang menjalankan skrip dan php_sapi_name dalam kombinasi karena mungkin bagi banyak pengguna untuk mengeksekusi Laravel dari CLI misalnya beberapa DBA mengakses server Anda atau Anda mungkin ingin CRON Laravel dijalankan sebagai apache. Anda dapat dapatkan nama proses yang menjalankan skrip ini menggunakan posix_getpwuid (posix_geteuid ()) ['name']; Lihat posting lengkap saya di bawah ini.
Andrew
Ini perlu diperbarui untuk versi Laravel terbaru: v5 +
Andrew
107

Laravel versi 5.6.10 dan yang lebih baru memiliki dukungan untuk permissionelemen dalam konfigurasi ( config/logging.php) untuk singledan dailydriver:

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

Tidak perlu bermain-main dengan Monolog dalam skrip bootstrap.

Secara khusus, dukungan telah ditambahkan di https://github.com/laravel/framework/commit/4d31633dca9594c9121afbbaa0190210de28fed8 .

crishoj
sumber
9
ini harus ada di dokumen resmi!
odupont
3
apostrof tidak ada dalam jawaban ini. Ini harus 'izin' => '0664'. Maka jawaban ini baik-baik saja!
Phil
2
@Phil Nope - ini hanyalah pembungkus untuk pengendali aliran Monolog yang menerima int untuk izin. Monolog membungkus php.net/manual/en/function.chmod.php - perhatikan bahwa 0 di depan diperlukan untuk memastikan itu adalah nilai oktal
Chris
7
'permission' => 0664bekerja untuk saya (tanpa kutipan)
Syclone
2
@Friedrich jika file log Anda dibuat dengan 'root' sebagai pemilik file, kemungkinan itu menandakan bahwa Anda memiliki masalah yang lebih besar dalam hal bagaimana server web Anda diatur
kjones
62

Untuk Laravel 5.1 saya menggunakan yang berikut ini di bagian bawah bootstrap/app.php(seperti yang disebutkan di dokumen ):

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

Ada banyak Handler lain yang bisa Anda gunakan, tentu saja.

Sam Wilson
sumber
1
Saya sangat menyukai jawaban ini karena 1) diperbarui menjadi 5.1 dan 2) menggunakan metode di dokumen untuk memperluas perilaku log.
Dylan Pierce
Luar biasa, flash maju tambahan tidak diperlukan tetapi masih berfungsi. Ini harus membaca ... $ filename = storage_path ('logs / laravel -'. Php_sapi_name (). '. Log');
Andrew
Dapatkah saya memberikan saran untuk menggunakan kedua nama pengguna yang menjalankan skrip dan php_sapi_name dalam kombinasi karena mungkin bagi banyak pengguna untuk mengeksekusi Laravel dari CLI misalnya beberapa DBA mengakses server Anda atau Anda mungkin ingin CRON Laravel dijalankan sebagai apache. Anda dapat dapatkan nama proses yang menjalankan skrip ini menggunakan posix_getpwuid (posix_geteuid ()) ['name']; Lihat posting lengkap saya di bawah ini.
Andrew
1
Bagaimana cara menggunakannya di Laravel 5.6? Karena Laravel 5.6 memiliki sistem Logging baru.
Hamed Kamrava
26

Untuk tujuan tersebut, Anda harus menggunakan ACL lanjutan pada file dan direktori Anda. setfaclakan menjadi jawaban Anda di sini. Jika Anda ingin memberikan izin pengguna www-data untuk menulis pada file root di direktori tertentu, Anda dapat melakukannya seperti ini:

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

Setelah mengeluarkan ini, Anda mengatur izin rwxuntuk www-data pengguna di semua file, /my/folder/siapa pun yang membuatnya. Silakan, lihat ini dan pertanyaan ini untuk referensi. Selain itu, Anda dapat memeriksa dokumen untuksetfacl .

Beri tahu saya jika ini membantu.

Paweł Tomkiel
sumber
3
Perintah berikut berfungsi untuk saya: setfacl -d -m g:www-data:rw /full/path/to/laravel/storage/logsdiikuti oleh php artisan cache:cleardan composer dump-autoload.
Sawny
17

Saya memiliki ini bekerja dengan cara yang sangat sederhana:

Saya mengalami masalah yang sama di Laravel 5.6

Di config/logging.phpsaya baru saja memperbarui nilai jalur saluran harian dengan php_sapi_name()di dalamnya.

Ini membuat durasi terpisah untuk php_sapi_name yang berbeda dan meletakkan file log dengan cap waktu ke direktori perticular mereka.

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

Jadi bagi saya,

  • File log dibuat di bawah fpm-fcgidirektori: Log dari situs web,owner: www-data
  • File log dibuat di bawah clidirektori: dari perintah artisan (cronjob).owner: root

Info lebih lanjut tentang logging Laravel 5.6: https://laravel.com/docs/5.6/logging

Ini config/logging.phpfile saya :

<?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',
        ],
    ],
];
Lahar Shah
sumber
bagus ... solusinya lebih bersih .. saya sedang mengujinya sekarang
Sina Miandashti
1
Seperti yang telah ditunjukkan di komentar lain, log hanyalah sebagian dari cerita. Ada tampilan yang dikompilasi, cache data, kode sumber pra-cache, yang mana saya dibuat sebagai file lokal oleh web atau pengguna cli.
Jason
2
Ini tidak berfungsi jika Anda menyimpan konfigurasi menggunakan cache artisan config:cache, karena ini akan membuat cache konfigurasi menggunakan cli SAPI yang akan digunakan untuk permintaan CLI dan web.
leeb
1
Ini bekerja untuk saya, mencoba get_current_usertidak berhasil, tetapi php_sapi_nameberhasil (meskipun tampaknya lebih buruk)
Richard Fu
Saya pikir ini adalah cara tercepat dan terbaik. Memodifikasi konfigurasi tidak mengubah struktur dasar Laravel, hanya konfigurasi.
William Prigol Lopes
12

Bagi saya masalah ini lebih dari sekadar izin log ... Saya memiliki masalah dengan apa pun yang terkait dengan bootstrap / cache dan folder penyimpanan di mana satu pengguna akan membuat file / folder dan yang lain tidak dapat mengedit / menghapus karena standar 644 dan 755 izin.

Skenario tipikal adalah:

  • File bootstrap / cache / compiled.php sedang dibuat oleh pengguna apache tetapi tidak dapat diedit oleh pengguna komposer saat melakukan perintah penginstalan komposer

  • Pengguna apache membuat cache yang tidak dapat dihapus menggunakan pengguna komposer

  • Kondisi balapan kayu yang ditakuti yang dijelaskan di atas.

Impiannya adalah tidak peduli pengguna mana yang membuat file / folder, pengguna lain yang membutuhkan akses memiliki izin yang sama persis dengan pembuat aslinya.

TL; DR?

Begini caranya.

Kita perlu membuat grup pengguna bersama yang disebut laravel, grup tersebut terdiri dari semua pengguna yang membutuhkan akses ke direktori penyimpanan dan bootstrap / cache. Selanjutnya kita perlu memastikan file dan folder yang baru dibuat memiliki grup laravel dan izin 664 dan 775 masing-masing.

Sangat mudah melakukan ini untuk file / direktori yang ada, tetapi sedikit keajaiban diperlukan untuk mengubah aturan pembuatan file / folder default ...

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

Murni untuk tujuan debugging saya menemukan membagi log keluar menjadi pengguna cli / web + bermanfaat jadi saya memodifikasi jawaban Sam Wilson sedikit. Kasus penggunaan saya adalah antrian dijalankan di bawah pengguna itu sendiri sehingga membantu membedakan antara pengguna komposer menggunakan cli (misalnya tes unit) dan daemon antrian.

$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);
}); 
Andrew
sumber
Ini sangat bagus. Apakah configureMonologUsingkode Anda masih diperlukan, setelah Anda menjalankan setfaclperintah?
jeff-h
7

Laravel 5.1.0

Dalam kasus kami, kami ingin membuat semua file log sehingga semua yang ada di deploygrup memiliki izin baca / tulis. Oleh karena itu, kami perlu membuat semua file baru dengan 0664izin, bukan0644 default.

Kami juga menambahkan pemformat untuk menambahkan baris baru agar lebih mudah dibaca:

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

Juga dimungkinkan untuk menggabungkan ini dengan jawaban yang diterima

$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);
});
Artur Käpp
sumber
6

Salah satu cara non-Laravel untuk membuat ini berfungsi adalah dengan menjalankan cronjob Anda sebagai www-data.

misalnya /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

pengguna2662680
sumber
5

Laravel 5.5

Tambahkan kode ini ke 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);
});
  • Ini akan menyimpan file seperti ini: laravel-2018-01-27-cli-raph.logdan laravel-2018-01-27-fpm-cgi-raph.logmana yang lebih mudah dibaca.
  • Baris baru dipertahankan (sebagai perilaku Laravel default)
  • Ia bekerja dengan Laravel Log Viewer

Laravel 5.6

Anda harus membuat kelas untuk logger Anda:

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

Kemudian, Anda harus mendaftarkannya di config/logging.php:

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

Perilaku yang sama seperti untuk 5.5:

  • Ini akan menyimpan file seperti ini: laravel-2018-01-27-cli-raph.logdan laravel-2018-01-27-fpm-cgi-raph.logmana yang lebih mudah dibaca.
  • Baris baru dipertahankan (sebagai perilaku Laravel default)
  • Ia bekerja dengan Laravel Log Viewer
rap-2-jam
sumber
Jawaban Terbaik! Kudos
Shahid Karimi
4

Tambahkan sesuatu seperti berikut ini ke awal app/start/artisan.phpfile Anda (ini dengan 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);
}

Sesuaikan jalur jika file log harian yang Anda sebutkan bukan file log Laravel standar. Anda juga mungkin tidak ingin mengubah grup atau mengatur izin seperti yang saya lakukan di sini. Di atas menyetel grup ke www-datadan menyetel izin menulis grup. Saya kemudian menambahkan pengguna biasa saya ke www-datagrup sehingga menjalankan perintah artisan sebagai pengguna biasa saya masih bisa menulis ke log.

Perubahan terkait adalah menempatkan yang berikut ini di awal app/start/global.phpfile Anda :

umask(0002);

Jika Anda melakukan ini, chmodbaris di atas menjadi diperdebatkan. Dengan umask disetel ke ini, file baru apa pun yang dibuat oleh PHP (dan oleh karena itu Laravel) akan memiliki izin yang hanya disembunyikan sehingga pengguna "lain" tidak akan memiliki izin menulis. Ini berarti direktori akan mulai sebagai rwxrwxr-xdan file sebagai rw-rw-r--. Jadi jika www-datamenjalankan PHP, cache dan file log apa pun yang dibuatnya akan dapat ditulisi secara default oleh siapa pun di grup utama pengguna tersebut, yaitu www-data.

gemetar
sumber
4

(Laravel 5.6) Baru-baru ini saya mengalami masalah yang sama dan saya cukup menyetel perintah terjadwal untuk dijalankan /app/Console/Kernel.php.

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

Saya tahu ini sedikit berlebihan, tetapi berfungsi seperti pesona dan tidak memiliki masalah sejak saat itu.

Ague Mort
sumber
Berhasil ? Ya, tapi Apakah praktik terbaik? Saya pikir tidak.
Pablo Papalardo
3

Laravel 5.4

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

tambahkan ke bootfungsi diAppServiceProvider

StupidDev
sumber
1

Laravel 5.8

Laravel 5.8 memungkinkan Anda mengatur nama log masuk config/logging.php.

Jadi menggunakan jawaban dan komentar sebelumnya, jika Anda ingin memberi nama Anda log menggunakan nama pengguna posix yang sebenarnya DAN php_sapi_name()nilainya, Anda hanya perlu mengubah kumpulan nama log. Menggunakan driver harian memungkinkan rotasi log yang berjalan per kombinasi pengguna / api yang akan memastikan bahwa log selalu dirotasi oleh akun yang dapat mengubah log.

Saya juga menambahkan pemeriksaan untuk fungsi posix yang mungkin tidak ada di lingkungan lokal Anda, dalam hal ini nama log hanya default ke standar.

Dengan asumsi Anda menggunakan saluran log default 'harian', Anda dapat mengubah kunci 'saluran' seperti ini:

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

Ini akan menghasilkan nama log yang harus unik untuk setiap kombinasi seperti laravel-cli-sfscs-2019-05-15.logatau laravel-apache2handler-apache-2019-05-15.logbergantung pada titik akses Anda.

sfscs
sumber
0

Anda cukup mengubah izin file log di perintah artisan Anda:

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

di mana get_current_user () akan mengembalikan pengguna dari skrip saat ini.

Dengan kata lain, daily.logakan selalu memiliki www-datasebagai pemiliknya, bahkan jika Anda menginisialisasi skrip sebagai rootpengguna.

Adam
sumber
0

Jika Anda menggunakan Laravel Envoyer , berikut ini kemungkinan perbaikan menggunakan ACL di Linux:

1. Pertama, jalankan skrip berikut dengan rootizin di server:

Di kedua skrip, Anda harus mengganti variabel seperti yang diinstruksikan di bawah ini:

  • {{MASTER_PATH}} : Jalur ke direktori host virtual Anda (mis. Folder> yang berisi aplikasi Anda).
  • {{WEB_SERVER_USER}} : Pengguna yang digunakan server web Anda.
  • {{DEPLOYMENT_USER}} : Pengguna yang menjalankan skrip penerapan Anda.
#!/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. Siapkan hook penerapan berikut pada utusan di bawah "Activate New Release"> "Before This Action

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. Terapkan ulang aplikasi Anda

Sekarang terapkan ulang aplikasi Anda, dan itu akan berhasil ke depannya.

Catatan: Skrip yang ditentukan di 1. harus dijalankan setiap kali Anda menambahkan proyek baru ke mesin.

Emil Pedersen
sumber
0
cd /path/to/project
chown -R www-data:root .
chmod -R g+s .
Eduardo
sumber
-1

Cara terbaik yang saya temukan adalah saran fideloper, http://fideloper.com/laravel-log-file-name , Anda dapat mengatur konfigurasi log laravel tanpa kelas Log sentuh. Memiliki nama yang berbeda untuk program Konsol dan program Http, menurut saya, adalah solusi terbaik.

Giacomo
sumber
-1

Solusi ini pasti akan berfungsi pada Laravel V5.1 - V6.x

Alasan kesalahan ini:

  • Ada penyebab utamanya karena masalah izin
  • Variabel lingkungan tidak ditemukan atau .envfile tidak ditemukan di direktori root Anda
  • Masalah ekstensi PHP
  • Masalah database

Memperbaiki:

  • Setel izin yang benar:
    • Jalankan perintah ini (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
  • Jika file .env tidak ada, buat satu dengan touch .envdan tempel variabel lingkungan Anda dan kemudian jalankan
   php artisan key:generate
   php artisan cache:clear
   php artisan config:clear
   composer dump-autoload
   php artisan migrate //only if not already migrated
Smit Patel
sumber