Bagaimana cara memperbaiki Kesalahan: laravel.log tidak dapat dibuka?

184

Saya cukup baru di laravel, sebenarnya dan saya sedang mencoba untuk membuat proyek pertama saya. untuk beberapa alasan saya terus mendapatkan kesalahan ini (saya bahkan belum memulai pengkodean)

Error in exception handler: The stream or file "/var/www/laravel/app/storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied in /var/www/laravel/bootstrap/compiled.php:8423

Saya sudah membaca ini ada hubungannya dengan izin tetapi chmod -R 775 storagetidak membantu sama sekali.

Izin

FRR
sumber
Apakah Anda yakin Anda berada di direktori yang benar ketika menjalankan perintah chmod itu? Coba chmod -R 755 / var / www / laravel / app / storage. Juga, untuk apa pengguna dan grup diatur? Coba ls -al / var / www / laravel / app / storage
Ryan LaB
hasil yang sama (saya memperbarui posting asli saya untuk menunjukkan izin folder)
FRR
: / untuk beberapa alasan itu masih tidak berfungsi. Saya tidak menyebutkannya sebelumnya, tetapi saya menggunakan gelandangan. jadi folder www saya ada di VM (apache, php dan yang lainnya berjalan di atasnya). Saya tidak yakin apakah itu ada hubungannya dengan sesuatu tetapi saya pikir saya akan menyebutkannya untuk berjaga-jaga. (Saya membuat proyek saya dengan vm, menggunakan komposer)
FRR
13
Orang-orang yang menyarankan 777, coba google frase ini: "production db_password filetype: env inurl: com"
Tarasovych
1
Menonaktifkan SELINUX bekerja untuk saya.
Prakash P

Jawaban:

306

Jangan pernah mengatur direktori ke 777 . Anda harus mengubah kepemilikan direktori. jadi atur pengguna saat ini yang Anda gunakan sebagai pemilik dan pengguna server web (www-data, apache, ...) sebagai grup. Anda dapat mencoba ini:

sudo chown -R $USER:www-data storage
sudo chown -R $USER:www-data bootstrap/cache

lalu untuk mengatur izin direktori coba ini:

chmod -R 775 storage
chmod -R 775 bootstrap/cache

Memperbarui:

Pengguna dan grup server Web bergantung pada server web Anda dan OS Anda. untuk mengetahui apa yang pengguna dan grup server web Anda menggunakan perintah berikut. untuk penggunaan nginx:

ps aux|grep nginx|grep -v grep

untuk penggunaan apache:

ps aux | egrep '(apache|httpd)'

Hamid Parchami
sumber
4
Terima kasih! Singkatnya, Anda juga dapat melakukan:sudo chown -R {your current user}:www-data storage bootstrap/cache
Ramesh Pareek
2
@RameshPareek Anda benar tetapi saya hanya ingin lebih jelas;)
Hamid Parchami
1
Ini tidak berhasil untuk saya. Saya baru saja mendapatkannya chown: www-data: illegal group name. Mengatur direktori ke 777 adalah satu-satunya hal yang berfungsi
Matt D
3
@ Mat Saya kira grup apache di mac _wwwcoba ini sudo chgrp -R _www bootstrap/cache. akan sangat membantu untuk melihat posting ini: stackoverflow.com/a/6419695/2125114
Hamid Parchami
3
Ini harus menjadi jawaban yang dipilih, 100% setuju bahwa sysadmin tidak boleh hanya mengizinkan akses ke segala sesuatu untuk menghindari menyelesaikan masalah sebenarnya.
HyperionX
134

Jangan pernah menggunakan 777 untuk direktori di server langsung Anda, tetapi di komputer Anda sendiri, terkadang kami perlu melakukan lebih dari 775, karena

chmod -R 775 storage

Cara

7 - Owner can write
7 - Group can write
5 - Others cannot write!

Jika server web Anda tidak berjalan sebagai Vagrant, itu tidak akan bisa menulis ke sana, jadi Anda memiliki 2 opsi:

chmod -R 777 storage

atau ubah grup menjadi pengguna server web Anda, seandainya itu www-data:

chown -R vagrant:www-data storage
Antonio Carlos Ribeiro
sumber
Tidak perlu chmod dalam kasus saya karena sudah ditetapkan oke, Namun pada Fedora 20 dibutuhkan:chown -R apache:apache laravelproject
misterjaytee
Sedang mengalami masalah pemasangan folder melalui samba / gelandangan - chown -R vagrant:www-data storagemelakukannya untuk saya, terima kasih.
Lewis
1
penyimpanan chmod -R 777 bekerja untuk saya. Saya mencoba mengubah grup, tetapi saya terus mendapatkanwww-data: illegal group name
Matt D
57

Untuk memperbaiki masalah ini, Anda perlu mengubah kepemilikan direktori ke pengguna unix yang digunakan server web.

  1. Keluar dari VM
  2. Menggunakan konsol, buka folder Anda yang disinkronkan (gelandangan)
  3. sudo chown -R $ USER: penyimpanan data-www
  4. chmod -R 775 penyimpanan

Meskipun saya membuat proyek dalam VM menggunakan pengguna VM, folder tersebut milik pengguna di komputer nyata; jadi, ketika mencoba

Sekarang berhasil.

Terima kasih untuk semua yang membantu saya memecahkan masalah ini

EDIT:

Sebenarnya, itu masih tidak berfungsi, itu masih memberi saya masalah "izin ditolak".

Inilah yang saya lakukan, saya memodifikasi Vagrantfile saya seperti ini:

config.vm.synced_folder "./app","/var/www/", create:true,
:owner => "vagrant",
:group => "www-data",
:mount_options => ["dmode=775","fmode=664"]
FRR
sumber
Saya melakukan itu ... dan SAYA GOBOT! Masih tidak berfungsi ... laravel 5 ... mengganti nama file log, laravel membuat yang baru ... kesalahan yang sama
ied3vil
1
Saya tidak punya config.vm.synced_folder karena saya menggunakan homestead, bagaimana saya bisa memperbaiki masalah ini?
oleynikd
21
Anda seharusnya tidak menggunakan 777 semua mau tak mau.
IIllIIll
Saya tidak melihat masalah dalam menggunakan 777 pada folder. Saya tahu persis apa yang ada di dalamnya (proyek sampel dummy)
FRR
2
Ini sama sekali bukan jawaban yang diterima. Itu mengerikan. Tidak pernah mengatur 777. Pernah.
CGriffin
39

Mungkin juga SELinux. (Centos, RedHat)

Tentukan status SElinux pada terminal:

$ sestatus

Jika status diaktifkan, tulis perintah untuk menonaktifkan SElinux

$ setenforce Permissive

Atau Anda dapat menjalankan perintah ini

$ sudo setenforce 0

Turan Zamanlı
sumber
6
Ini adalah satu-satunya hal yang berhasil, bisakah Anda menjelaskan apa fungsinya?
hack4mer
2
@ hack4mer Anda dapat membaca informasi lebih lanjut tentang seLinux. en.wikipedia.org/wiki/Security-Enhanced_Linux
Turan Zamanlı
hal-hal aneh yang pernah saya lihat, kenapa bisa bekerja setelah mencari lebih dari 6 jam
Muhamad Yulianto
1
Satu-satunya solusi yang bekerja untuk saya .. terima kasih. Tetapi masalahnya kembali setiap kali server restart, apakah Anda tahu bagaimana membuatnya berlaku bahkan jika server restart?
Juan Angel
1
@JuanAngel Anda harus menonaktifkan layanan secara permanen. buka dengan editor vim / etc / sysconfig / selinux dan kemudian ubah direktif SELinux = menegakkan ke SELinux = dinonaktifkan
Turan Zamanlı
31

Anda harus menyesuaikan izin storagedan bootstrap/cache.

  • cd ke dalam proyek Laravel Anda.
  • sudo chmod -R 755 storage
  • sudo chmod -R 755 bootstrap/cache

Anda dapat mencoba 777 jika 755 tidak berhasil. 777 tidak aman!

Bergantung pada bagaimana pengaturan server web Anda, Anda mungkin bisa lebih spesifik dengan izin Anda, dan hanya memberikannya kepada pengguna server web Anda. Google WEB SERVER NAME Laravel file permissionsuntuk informasi lebih lanjut.

Pada saat penulisan, ini untuk Laravel 5.4

Daniel Dewhurst
sumber
14

Tambahkan composer.json

"scripts": {
    "post-install-cmd": [
          "chgrp -R www-data storage bootstrap/cache",
          "chmod -R ug+rwx storage bootstrap/cache"
     ]
}

Setelah composer install

Davron Achilov
sumber
12

Jalankan perintah berikut dan Anda dapat menambahkan sudopada awal perintah tergantung pada sistem Anda:

chmod -R 775 storage/framework
chmod -R 775 storage/logs
chmod -R 775 bootstrap/cache 
gauravbhai daxini
sumber
1
Jangan pernah gunakan 777. Dengan 777 izin, Anda memberi siapa pun yang koneksi akses penuh ke file atau direktori dengan izin itu. Mereka dapat mengubahnya dengan cara apa pun yang mereka pilih, termasuk dengan jahat. Banyak insiden peretasan akun berasal dari 777 izin.
Odyssee
8

Untuk semua pengguna Centos 7 pada konteks Laravel, tidak perlu menonaktifkan Selinux, cukup jalankan perintah ini:

yum install policycoreutils-python -y # might not be necessary, try the below first

semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/laravel/storage(/.*)?" # add a new httpd read write content to sellinux for the specific folder, -m for modify
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/laravel/bootstrap/cache(/.*)?" # same as the above for b/cache

restorecon -Rv /var/www/html/ # this command is very important to, it's like a restart to apply the new rules

Terakhir, pastikan host, ips, dan host virtual Anda semuanya benar untuk mengakses jarak jauh.

Selinux dimaksudkan untuk membatasi akses bahkan untuk pengguna root, jadi hanya hal-hal yang diperlukan yang dapat diakses, setidaknya pada tinjauan umum, itu keamanan ekstra, menonaktifkan itu bukan praktik yang baik, ada banyak tautan untuk mempelajari Selinux, tetapi untuk ini hal itu bahkan tidak diperlukan.

Daniel Santos
sumber
Meskipun tautan ini dapat menjawab pertanyaan, lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini dan memberikan tautan untuk referensi. Jawaban hanya tautan dapat menjadi tidak valid jika halaman tertaut berubah. - Dari Ulasan
Patrick Mevzek
Tautannya sangat eksplisit, tidak perlu mekanisme seperti itu, bahkan ada bagian khusus untuk konteks Laravel SELinux. Saya pikir pendapat Anda harus didukung oleh sedikit lebih banyak logika daripada sekadar aturan praktis. Sementara itu, Anda menurunkan jawaban yang kemungkinan besar akan memperbaiki masalah 99% tanpa mematuhi praktik buruk seperti menonaktifkan Selinux.
Daniel Santos
Bukan masalah untuk menjadi eksplisit atau tidak. Gagasan dari situs ini adalah bahwa ia berisi semua informasi yang relevan, jadi dengan membaca jawaban, kami mendapatkan semuanya. Tautan eksternal mungkin membusuk dan kemudian jawabannya menjadi tidak berharga. Ini dijelaskan di pusat bantuan di stackoverflow.com/help/how-to-answer : "Tautan ke sumber daya eksternal dianjurkan, tapi tolong tambahkan konteks di sekitar tautan sehingga sesama pengguna Anda akan mengetahui apa itu dan mengapa ada . Selalu mengutip bagian yang paling relevan dari link penting, dalam hal situs target tidak bisa diakses atau pergi secara permanen offline. "
Patrick Mevzek
Pertanyaan Anda ditandai untuk ditinjau, itu saja. Dan itu bertentangan dengan apa yang tertulis di Pusat Bantuan yang saya kutip. Semua jawaban hanya dengan tautan dan tidak ada uraian yang diturunkan dan bahkan dihapus. Jangan ragu untuk mengedit jawaban Anda untuk memberikan bagian yang relevan dari penjelasan di sini. Dan Anda bebas sendiri untuk menurunkan semua jawaban yang Anda anggap buruk. Anda dapat melihat dari tautan ulasan bahwa saya tidak sendirian dalam merekomendasikan jawaban Anda untuk ditutup. Bukan karena kemampuan teknis, hanya karena tautan tidak cukup.
Patrick Mevzek
Terima kasih atas klarifikasi, saya tidak tahu pedoman semacam itu ada, atau jika bahkan ketika pada proses pendaftaran Anda mendapatkan tip untuk membaca sumber daya, saya tidak ingat itu. Apa yang Anda katakan mungkin benar, tautannya mungkin membusuk, tetapi jawaban dapat dicapai tanpa usaha, apa pun, saya akan mengeditnya.
Daniel Santos
6

Jika Anda menggunakan cmd

sudo chown -R $USER:www-data storage
sudo chown -R $USER:www-data bootstrap/cache

Jika Anda menggunakan GUI

Pertama pergi ke proyek dan klik kanan pada penyimpanan dan periksa properti dan pergi ke tab Izin

masukkan deskripsi gambar di sini

Ubah izin menggunakan kode di bawah ini

sudo chmod -R 777 storage

Maka properti file Anda mungkin

masukkan deskripsi gambar di sini

Kemudian periksa pengaturan Anda dan jalankan perintah laravel itu akan berhasil :)

Thilina Dharmasena
sumber
Terima kasih yoouuuuuu
viniciussvl
5

Di Laravel, Anda harus mengatur ACL storagedan cachedirektori sehingga pengguna server web dapat membaca / menulis di direktori. Buka terminal baru dan jalankan berikut ini:

HTTPDUSER=$(ps axo user,comm | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1)

sudo setfacl -dR -m u:"$HTTPDUSER":rwX -m u:$(whoami):rwX bootstrap/cache storage/
sudo setfacl -R -m u:"$HTTPDUSER":rwX -m u:$(whoami):rwX bootstrap/cache storage/

Referensi:

https://symfony.com/doc/3.4/setup/file_permissions.html#using-acl-on-a-system-that-supports-setfacl-linux-bsd

https://linux.die.net/man/1/setfacl

Pratik
sumber
5

Mungkin terlambat tetapi dapat membantu seseorang, mengubah izin direktori berfungsi untuk saya.

Dengan asumsi bahwa proyek Laravel Anda ada di /var/www/html/direktori.

cd /var/www/html/

Kemudian ubah izin storage/dan bootstrap/cache/direktori.

sudo chmod -R gu+w storage/
sudo chmod -R guo+w storage/
sudo chmod -R gu+w bootstrap/cache/
sudo chmod -R guo+w bootstrap/cache/
Hamza Rashid
sumber
2

Solusi ini khusus untuk laravel 5.5

Anda harus mengubah izin untuk beberapa folder: chmod -R -777 penyimpanan / log chmod -R -777 penyimpanan / kerangka kerja untuk folder di atas 775 atau 765 tidak berfungsi untuk proyek saya

chmod -R 775 bootstrap/cache 

Juga kepemilikan folder proyek harus sebagai berikut (pengguna saat ini) :( pengguna server web)

s_user
sumber
2

Anda bisa melakukannya:

chcon -R -t httpd_sys_rw_content_t storage
Leandro Gorriz
sumber
1

Saya tidak terlalu tertarik untuk mengubah izin folder saya ke 777. Begini cara saya memperbaiki masalah ini.

Pertama, saya mengubah pengguna yang menjalankan server web pada mesin lokal saya (saya menjalankan nginx, tetapi prinsipnya berlaku di mana-mana):

$> sudo vim /etc/nginx/nginx.conf
user <my_user> #inside nginx.conf
service nginx reload

Setelah itu, saya membuat index.phpfile lain di bawah public/folder untuk mencari tahu siapa yang menjalankan versi php-fpm saya dan ke mana saya akan mengubah itu:

<?php
phpinfo();
?>

Reload halaman, saya menemukan itu www-dataadalah pengguna (di bawah bagian lingkungan). Saya juga tahu saya menjalankan php 7.1. Saya melanjutkan untuk mengubah pengguna:

$> sudo vim /etc/php/7.0/fpm/pool.d/www.conf 
#Look for www-data or the following variables: user, group, listen.user, listen.group.

Akhirnya, saya memberikan izin berikut ke folder:

sudo chmod -R 775 ./storage/

Sekarang, saya memastikan bahwa saya adalah pemilik folder dengan menggunakan yang sederhana:

ls -al

Jika Anda mengatur pengguna server dan php-fpm untuk diri sendiri dan folder dimiliki oleh root misalnya, maka Anda akan terus menghadapi masalah ini. Ini bisa terjadi jika Anda melakukan sudo laravel new <project>root. Dalam hal ini, pastikan Anda menggunakan chownperintah rekursif pada proyek Anda untuk mengubah user:grouppengaturan. Dalam kebanyakan kasus standar, www-dataadalah pengaturan utama untuk server dan php, dalam hal ini adalah masalah memastikan folder tidak di luar www-datajangkauan.

Proyek saya diatur dalam direktori rumah saya. Di Ubuntu 16.04 dan Laravel 5.5.

Patrick.SE
sumber
1

coba ini

  1. cd / var / www / html
  2. setenforce 0
  3. layanan httpd restart
Dan Christian Febra
sumber
Bisakah Anda menjelaskan apa fungsinya?
Semakin Idiotik
1
Tidak perlu mengubah direktori untuk digunakan, setenforcetetapi dalam hal apa pun salah untuk sepenuhnya menonaktifkan SELinux hanya untuk memperbaiki satu masalah izin.
Patrick Mevzek
0

Dalam kasus khusus saya, saya memiliki file konfigurasi yang dihasilkan dan di-cache ke bootstrap/cache/direktori sehingga langkah saya di mana:

  1. Hapus semua file cache yang dihasilkan: rm bootstrap/cache/*.php
  2. Buat laravel.logfile baru dan terapkan pembaruan izin pada file menggunakan:

    • chmod -R 775 storage
Crisoforo Gaspar
sumber
0

(di Ubuntu ): Dapat dipecahkan dalam 2 langkah sederhana:

$ sudo chmod -R 777 storage 

Dan

$ sudo service apache2 restart
7 percayalah
sumber
Langkah 3: dapatkan server Anda dan / atau pengguna Anda diretas karena Anda telah membuka file Anda ke dunia.
miken32
0

Hapus "/var/www/laravel/app/storage/logs/laravel.log"dan coba lagi:

rm storage/logs/laravel.log

Gjaa
sumber
-1

Punya masalah ini dan menemukan ini dan itu memecahkan masalah.

masukkan deskripsi gambar di sini

pengguna2848911
sumber
-1

Kesalahan ini dapat diperbaiki dengan menonaktifkan Linux.

Periksa apakah sudah diaktifkan

sestatus

Kamu mencoba ..

setenforce 0

orxanzadeh
sumber
5
"dengan menonaktifkan Linux "? Itu terlalu serius :-)!
Patrick Mevzek
-1

Untuk kesalahan ini:

Kesalahan dalam handler pengecualian: Aliran atau file "/var/www/laravel/app/storage/logs/laravel.log" tidak dapat dibuka: gagal membuka streaming: Izin ditolak di / var / www / laravel / bootstrap / dikompilasi .php: 8423

gunakan perintah ini di terminal:

sudo chmod -R 777 storage
khushbu vaishnav
sumber
2
Sayang sekali untuk produksi env
Ariful Haque
-1

Memperbaiki masalah saya dengan perintah ini di centos 7.6 Server

chcon -R -t httpd_sys_content_t $SITE_PATH

chcon -R -t httpd_sys_rw_content_t $SITE_PATH
HamidNE
sumber