Bagaimana cara mengatur izin file untuk Laravel?

234

Saya menggunakan Apache Web Server yang memiliki pemilik diatur ke _www:_www. Saya tidak pernah tahu apa praktik terbaik dengan izin file, misalnya ketika saya membuat proyek Laravel 5 baru.

Laravel 5 memerlukan /storagefolder yang dapat ditulis. Saya menemukan banyak pendekatan berbeda untuk membuatnya bekerja dan saya biasanya berakhir dengan membuatnya 777chmod secara rekursif. Saya tahu itu bukan ide terbaik.

Doc resmi mengatakan:

Laravel mungkin memerlukan beberapa izin untuk dikonfigurasi: folder di dalam storagedan vendormemerlukan akses tulis oleh server web.

Apakah ini berarti bahwa web server membutuhkan akses ke storagedan vendorfolder diri mereka terlalu atau hanya isinya saat ini?

Saya berasumsi bahwa yang jauh lebih baik adalah mengubah pemilik alih-alih izin. Saya mengubah semua izin file Laravel secara rekursif _www:_wwwdan itu membuat situs berfungsi dengan benar, seolah-olah saya mengubah chmod 777. Masalahnya adalah bahwa sekarang editor teks saya meminta kata sandi setiap kali saya ingin menyimpan file apa pun dan hal yang sama terjadi jika saya mencoba mengubah apa pun di Finder, seperti misalnya menyalin file.

Apa pendekatan yang benar untuk menyelesaikan masalah ini?

  1. Perubahan chmod
  2. Ubah pemilik file agar sesuai dengan yang ada di server web dan mungkin atur editor teks (dan Finder?) Untuk melewati meminta kata sandi, atau membuatnya menggunakan sudo
  3. Ubah pemilik server web agar sesuai dengan pengguna os (Saya tidak tahu konsekuensinya)
  4. Sesuatu yang lain
Robo Robok
sumber
4
Saya pikir 777terlalu banyak kebebasan, karena itu mencakup semua izin untuk semua orang.
Robo Robok
Dari dokumen Laravel: Direktori di dalam storagedan bootstrap/cachedirektori harus dapat ditulis oleh server web Anda
joshuamabina
1
gunakan fcgi dan Anda dapat 755/644 untuk semua (termasuk publik / penyimpanan)
Jeffz
@jww setuju, bisakah kita memindahkan pertanyaan ke serverfault alih-alih menahannya?
wp78de

Jawaban:

588

Hanya untuk menyatakan yang jelas bagi siapa saja yang melihat diskusi ini .... jika Anda memberikan salah satu folder Anda 777 izin, Anda mengizinkan SIAPAPUN untuk membaca, menulis, dan mengeksekusi file apa pun di direktori itu .... apa artinya ini yang telah Anda berikan SIAPAPUN (peretas atau orang jahat di seluruh dunia) mengizinkan untuk mengunggah file APA SAJA, virus, atau file apa pun lainnya, dan MAKA jalankan file itu ...

JIKA ANDA MENYETEL IZIN FOLDER ANDA KE 777, ANDA TELAH MEMBUKA SERVER ANDA KEPADA SIAPA PUN YANG DAPAT MENEMUKAN DIREKTORI YANG. Cukup jelas ??? :)

Pada dasarnya ada dua cara untuk mengatur kepemilikan dan izin Anda. Entah Anda memberikan diri Anda kepemilikan atau Anda menjadikan server web pemilik semua file.

Webserver sebagai pemilik (cara kebanyakan orang melakukannya, dan cara Laravel doc):

dengan asumsi www-data (bisa jadi yang lain) adalah pengguna server web Anda.

sudo chown -R www-data: www-data / path / ke / direktori / laravel / root /

jika Anda melakukan itu, server web memiliki semua file, dan juga grup, dan Anda akan mengalami masalah dalam mengunggah file atau bekerja dengan file melalui FTP, karena klien FTP Anda akan login seperti Anda, bukan server web Anda, jadi tambahkan pengguna Anda ke grup pengguna server web:

sudo usermod -a -G www-data ubuntu

Tentu saja, ini mengasumsikan server web Anda berjalan sebagai www-data (default Homestead), dan pengguna Anda adalah ubuntu (itu adalah omong kosong jika Anda menggunakan Homestead).

Kemudian Anda mengatur semua direktori Anda ke 755 dan file Anda ke 644 ... SET izin file

sudo find / path / ke / Anda / laravel / root / direktori -type f -exec chmod 644 {} \;    

SET izin direktori

sudo find / path / to / your / laravel / root / direktori -type d -exec chmod 755 {} \;

Pengguna Anda sebagai pemilik

Saya lebih suka memiliki semua direktori dan file (itu membuat bekerja dengan semuanya jauh lebih mudah), jadi saya lakukan:

sudo chown -R my-user: www-data / path / ke / direktori / laravel / root /

Lalu saya memberikan izin untuk diriku dan server web:

sudo find / path / to / your / laravel / root / direktori -type f -exec chmod 664 {} \;    
sudo find / path / ke / Anda / laravel / root / direktori -type d -exec chmod 775 {} \;

Kemudian berikan server web hak untuk membaca dan menulis ke penyimpanan dan cache

Apa pun cara Anda mengaturnya, maka Anda harus memberikan izin baca dan tulis ke server web untuk penyimpanan, cache, dan direktori lain mana pun yang perlu diunggah atau ditulis server web (tergantung pada situasi Anda), jadi jalankan perintah dari bashy di atas:

sudo chgrp -R www-penyimpanan data bootstrap / cache
sudo chmod -R ug + penyimpanan bootwap rwx / cache

Sekarang, Anda aman dan situs web Anda berfungsi, DAN Anda dapat bekerja dengan file dengan cukup mudah

bgies
sumber
4
Contoh yang bagus, jika tidak ada pengguna data-www, gunakan apache: apache sebagai pengganti data-www (pada beberapa distro)
Denis Solakovic
53
Saya pikir orang salah paham terlalu banyak anyonekonsep. anyoneBendera Linux berarti setiap pengguna , bukan siapa pun. Anda masih memerlukan akses server.
Marco Aurélio Deleu
3
@ andreshg112 www-data pertama adalah nama pengguna, dan www-data kedua adalah nama grup. Jadi itu berarti pemiliknya adalah apache dan (grup ini) apache. Gunakan www-data: www-data atau tambahkan pengguna Anda ke grup itu. (CLI: useradd -G {group-name} username), dan daripada yang dapat Anda ketahui dengan nama pengguna: www-group
Denis Solakovic
2
@ fs_tigre Saya tidak berpikir ada banyak perbedaan sama sekali untuk keamanan ... kecuali saya kira ada dua pengguna untuk menebak kata sandi alih-alih satu, dan tentu saja saya masuk sepanjang waktu dengan akun pengguna saya, jadi jika Saya melakukannya dengan cara yang tidak aman (FTP normal dan menggunakan kata sandi misalnya) itu bisa membahayakan situs, tapi saya hanya login dengan Putty dan SSH, dan ketika saya menggunakan FTP itu SFTP, jadi tidak ada masalah sama sekali. Perintah yang disarankan oleh bashy direkomendasikan karena mereka menetapkan bit sticky, jadi jika server web Anda membuat subdirektori, mereka akan memiliki pemilik / izin yang sama dengan induknya
bgies
3
Pada metode pertama, bukankah pengguna masih tidak dapat mengunggah file karena Anda tidak memberi writeizin kepada grup?
Fahmi
44

Izin untuk storagedan vendorfolder harus tetap ada 775, untuk alasan keamanan yang jelas.

Namun, baik komputer Anda dan Apache server Anda harus dapat menulis di folder ini. Mis: ketika Anda menjalankan perintah like php artisan, komputer Anda perlu menulis di file log storage.

Yang perlu Anda lakukan adalah memberikan kepemilikan folder ke Apache:

sudo chown -R www-data:www-data /path/to/your/project/vendor
sudo chown -R www-data:www-data /path/to/your/project/storage

Maka Anda perlu menambahkan komputer Anda (direferensikan olehnya username) ke grup yang menjadi milik server Apache. Seperti itu:

sudo usermod -a -G www-data userName

CATATAN: Paling sering, groupNameadalah www-datatetapi dalam kasus Anda, ganti dengan_www

BassMHL
sumber
10
+1 Saya suka pendekatan ini. Tapi saya percaya chownperintah harus menyertakan flag -R. Juga, di laravel 5.1 dan 5.2, alih-alih direktori vendor, Anda harus memberikan akses ke direktori bootstrap / cache.
Jason Wheeler
apakah ada cara untuk menguji apakah ini akan berfungsi dengan baik? Maksud saya jika file log baru dibuat di dir penyimpanan / log yang akan memiliki izin yang benar bagaimana saya bisa memeriksanya?
Chaudhry Waqas
20

Kami telah mengalami banyak kasus tepi saat mengatur izin untuk aplikasi Laravel. Kami membuat akun pengguna terpisah ( deploy) untuk memiliki folder aplikasi Laravel dan menjalankan perintah Laravel dari CLI, dan menjalankan server web di bawah www-data. Salah satu masalah yang disebabkan oleh hal ini adalah bahwa file log dapat dimiliki oleh www-dataatau deploy, tergantung pada siapa yang menulis ke file log terlebih dahulu, jelas mencegah pengguna lain dari menulis ke sana di masa depan.

Saya telah menemukan bahwa satu-satunya solusi yang waras dan aman adalah dengan menggunakan ACL Linux. Tujuan dari solusi ini adalah:

  1. Untuk memungkinkan pengguna yang memiliki / menyebarkan aplikasi membaca dan menulis akses ke kode aplikasi Laravel (kami menggunakan nama pengguna deploy).
  2. Untuk memungkinkan www-datapengguna membaca akses ke kode aplikasi Laravel, tetapi tidak akses tulis.
  3. Untuk mencegah pengguna lain mengakses kode / data aplikasi Laravel sama sekali.
  4. Untuk memungkinkan www-datapengguna dan pengguna aplikasi ( deploy) menulis akses ke folder penyimpanan, terlepas dari pengguna mana yang memiliki file (jadi keduanya deploydan www-datadapat menulis ke file log yang sama misalnya).

Kami mencapai ini sebagai berikut:

  1. Semua file dalam application/folder dibuat dengan umask default 0022, yang menghasilkan folder yang memiliki drwxr-xr-xizin dan file -rw-r--r--.
  2. sudo chown -R deploy:deploy application/(atau cukup gunakan aplikasi Anda sebagai deploypengguna, yang kami lakukan).
  3. chgrp www-data application/untuk memberikan www-datagrup akses ke aplikasi.
  4. chmod 750 application/untuk memungkinkan deploypengguna membaca / menulis, www-datapengguna hanya baca, dan untuk menghapus semua izin untuk pengguna lain.
  5. setfacl -Rdm u:www-data:rwx,u:deploy:rwx application/storage/untuk mengatur izin default pada storage/folder dan semua subfolder. Setiap folder / file baru yang dibuat dalam folder penyimpanan akan mewarisi izin ini ( rwxuntuk keduanya www-datadan deploy).
  6. setfacl -Rm u:www-data:rwX,u:deploy:rwX application/storage/ untuk mengatur izin di atas pada file / folder yang ada.
Chris Schwerdt
sumber
15

Ubah izin untuk folder proyek Anda untuk mengaktifkan baca / tulis / exec untuk setiap pengguna dalam grup yang memiliki direktori (yang dalam kasus Anda adalah _www):

chmod -R 775 /path/to/your/project

Kemudian tambahkan nama pengguna OS X Anda ke _wwwgrup untuk memungkinkannya mengakses direktori:

sudo dseditgroup -o edit -a yourusername -t user _www
Bogdan
sumber
Ketika saya dseditgroupdisediakan oleh Anda, saya mendapatkan error: Username and password must be provided..
Robo Robok
Kesalahan saya, Anda perlu menjalankan perintah itu dengan pengguna yang memiliki izin yang sesuai, jadi tambahkan saja sudodi awal.
Bogdan
Jadi perlu saya pemilik perubahan file-file ke _www:_wwwatau myuser:_wwwjuga?
Robo Robok
Anda dapat meninggalkannya _www:_www, karena 775 berarti setiap pengguna dalam grup _wwwakan memiliki izin penuh untuk membaca / menulis / exect di folder itu, dan Anda baru saja menambahkan nama pengguna Anda ke grup itu.
Bogdan
Bisakah Anda memberi tahu saya satu hal? Apa artinya chown myuser:_www? Saya tahu yang pertama adalah pengguna dan yang kedua adalah grup, tetapi apakah ini berarti "pengguna ini DAN SIAPAPUN SIAPA PUN DARI grup ini" atau "pengguna ini TAPI HANYA JIKA DIA MILIK grup ini"?
Robo Robok
8

Sudah diposting

Yang perlu Anda lakukan adalah memberikan kepemilikan folder ke Apache:

tapi saya menambahkan -R untuk perintah chown : sudo chown -R www-data:www-data /path/to/your/project/vendor sudo chown -R www-data:www-data /path/to/your/project/storage

Stanislav Potapenko
sumber
3
Mengapa kita harus memberikan izin ke direktori vendor? Penyimpanan masuk akal, untuk menulis ke file log, dll. Tapi vendor? Mengapa?
Ali Haris
Seperti yang ditulis di atas dalam beberapa komentar: "Namun, baik komputer dan server Anda Apache harus dapat menulis di folder ini. Mis: ketika Anda menjalankan perintah seperti php artisan, komputer Anda perlu menulis dalam file log dalam penyimpanan."
Stanislav Potapenko
Kesalahan pada mac: chown: www-data: nama grup ilegal
Sunil Kumar
Silakan lihat stackoverflow.com/questions/8035939/…
Stanislav Potapenko
7

Sebagian besar folder harus "755" dan file normal, "644"

Laravel memerlukan beberapa folder agar dapat ditulis untuk pengguna server web. Anda dapat menggunakan perintah ini pada OS berbasis unix.

sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache
Siddharth Joshi
sumber
7

Tambahkan ke 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
2
Ini jawaban yang buruk. Anda seharusnya tidak perlu menggunakan 777 untuk folder apa pun jika Anda telah mengkonfigurasi server web dengan benar. Menggunakan 777 membuka server Anda bagi peretas untuk mengunggah file, dan mengeksekusi file tersebut jika mereka tahu di mana folder itu berada.
mbozwood
2
Baik. Apa yang anda tawarkan?
Davron Achilov
Dan jika demikian, apakah itu benar? chown -R $ USER: penyimpanan data-www, chown -R $ USER: www-data bootstrap / cache
Davron Achilov
Lihat jawaban yang benar, ini berisi semua informasi yang diperlukan yang dapat Anda masukkan ke dalam post-update :)
mbozwood
6

The Laravel 5.4 docs mengatakan:

Setelah menginstal Laravel, Anda mungkin perlu mengkonfigurasi beberapa izin. Direktori di dalam storagedan bootstrap/cachedirektori harus dapat ditulis oleh server web Anda atau Laravel tidak akan berjalan. Jika Anda menggunakan mesin virtual Homestead, izin ini harus sudah ditetapkan.

Ada banyak jawaban di halaman ini yang menyebutkan penggunaan 777izin. Jangan lakukan itu. Anda akan mengekspos diri Anda ke peretas.

Sebagai gantinya, ikuti saran orang lain tentang cara mengatur izin 755 (atau lebih ketat). Anda mungkin perlu mencari tahu pengguna mana yang menjalankan aplikasi Anda dengan menjalankan whoamidi terminal dan kemudian mengubah kepemilikan direktori tertentu menggunakan chown -R.

Jika Anda tidak memiliki izin untuk menggunakan sudokarena begitu banyak jawaban lain memerlukan ...

Server Anda mungkin merupakan host bersama seperti Cloudways.

(Dalam kasus saya, saya telah mengkloning aplikasi Laravel saya ke server Cloudways kedua saya, dan itu tidak sepenuhnya berfungsi karena izin dari storagedan bootstrap/cachedirektori kacau.)

Saya perlu menggunakan:

Cloudways Platform > Server > Application Settings > Reset Permission

Lalu aku bisa berlari php artisan cache:cleardi terminal.

Ryan
sumber
4

Solusi yang diposting oleh bgles tepat bagi saya dalam hal mengatur izin dengan benar pada awalnya (saya menggunakan metode kedua), tetapi masih memiliki potensi masalah untuk Laravel.

Secara default, Apache akan membuat file dengan 644 izin. Jadi itu cukup banyak dalam penyimpanan /. Jadi, jika Anda menghapus konten storage / framework / views, maka akses halaman melalui Apache Anda akan menemukan tampilan cache telah dibuat seperti:

-rw-r--r-- 1 www-data www-data 1005 Dec  6 09:40 969370d7664df9c5206b90cd7c2c79c2

Jika Anda menjalankan "artisan serve" dan mengakses halaman yang berbeda, Anda akan mendapatkan izin yang berbeda karena CLI PHP berperilaku berbeda dari Apache:

-rw-rw-r-- 1 user     www-data 16191 Dec  6 09:48 2a1683fac0674d6f8b0b54cbc8579f8e

Dalam dirinya sendiri ini bukan masalah besar karena Anda tidak akan melakukan semua ini dalam produksi. Tetapi jika Apache membuat file yang selanjutnya harus ditulis oleh pengguna, itu akan gagal. Dan ini dapat berlaku untuk file cache, tampilan cache dan log saat menggunakan menggunakan pengguna dan artisan login. Contoh yang mudah adalah "artisan cache: clear" yang akan gagal menghapus file cache apa pun yang merupakan www-data: www-data 644.

Ini dapat dikurangi sebagian dengan menjalankan perintah artisan sebagai www-data, jadi Anda akan melakukan / scripting semuanya seperti:

sudo -u www-data php artisan cache:clear

Atau Anda akan menghindari kebosanan ini dan menambahkan ini ke .bash_aliases Anda:

alias art='sudo -u www-data php artisan'

Ini cukup bagus dan tidak mempengaruhi keamanan dengan cara apa pun. Tetapi pada mesin pengembangan, menjalankan skrip pengujian dan sanitasi membuat ini sulit, kecuali jika Anda ingin membuat alias untuk menggunakan 'sudo -u www-data' untuk menjalankan phpunit dan segala sesuatu yang Anda periksa build Anda dengan yang dapat menyebabkan file dibuat.

Solusinya adalah dengan mengikuti saran bgles bagian kedua, dan tambahkan yang berikut ke / etc / apache2 / envvars, dan mulai ulang (tidak muat ulang) Apache:

umask 002

Ini akan memaksa Apache untuk membuat file sebagai 664 secara default. Dalam dirinya sendiri, ini dapat menghadirkan risiko keamanan. Namun, pada lingkungan Laravel sebagian besar sedang dibahas di sini (Homestead, Vagrant, Ubuntu) server web berjalan sebagai data-pengguna www di bawah grup data-www. Jadi jika Anda tidak secara sewenang-wenang mengizinkan pengguna untuk bergabung dengan grup data-www, seharusnya tidak ada risiko tambahan. Jika seseorang berhasil keluar dari server web, mereka memiliki tingkat akses www-data sehingga tidak ada yang hilang (meskipun itu bukan sikap terbaik untuk berhubungan dengan keamanan diakui). Jadi pada produksi relatif aman, dan pada mesin pengembangan pengguna tunggal, itu tidak masalah.

Pada akhirnya ketika pengguna Anda berada di grup data-www, dan semua direktori yang berisi file-file ini adalah g + s (file selalu dibuat di bawah grup direktori induk), apa pun yang dibuat oleh pengguna atau oleh data-www akan menjadi r / untuk yang lain.

Dan itulah tujuannya di sini.

sunting

Saat menyelidiki pendekatan di atas untuk menetapkan izin lebih lanjut, masih terlihat cukup baik, tetapi beberapa penyesuaian dapat membantu:

Secara default, direktori adalah 775 dan file 664 dan semua file memiliki pemilik dan grup pengguna yang baru saja menginstal framework. Jadi asumsikan kita mulai dari titik itu.

cd /var/www/projectroot
sudo chmod 750 ./
sudo chgrp www-data ./

Hal pertama yang kami lakukan adalah memblokir akses ke orang lain, dan menjadikan grup sebagai data-www. Hanya pemilik dan anggota www-data yang dapat mengakses direktori.

sudo chmod 2775 bootstrap/cache
sudo chgrp -R www-data bootstrap/cache

Untuk memungkinkan server web membuat services.json dan compiled.php, seperti yang disarankan oleh panduan instalasi Laravel resmi. Mengatur bit sticky grup berarti ini akan dimiliki oleh pembuatnya dengan grup data-www.

find storage -type d -exec sudo chmod 2775 {} \;
find storage -type f -exec sudo chmod 664 {} \;
sudo chgrp -R www-data storage

Kami melakukan hal yang sama dengan folder penyimpanan untuk memungkinkan pembuatan cache, log, sesi dan melihat file. Kami menggunakan find untuk secara eksplisit mengatur izin direktori secara berbeda untuk direktori dan file. Kami tidak perlu melakukan ini di bootstrap / cache karena tidak ada (biasanya) sub-direktori di sana.

Anda mungkin perlu menerapkan kembali flag yang dapat dieksekusi, dan menghapus vendor / * dan menginstal ulang dependensi komposer untuk membuat ulang tautan untuk phpunit et al, mis .:

chmod +x .git/hooks/*
rm vendor/*
composer install -o

Itu dia. Kecuali umask untuk Apache yang dijelaskan di atas, ini semua yang diperlukan tanpa membuat seluruh projectroot dapat ditulis oleh www-data, yang merupakan apa yang terjadi dengan solusi lain. Jadi sedikit lebih aman dengan cara ini karena penyusup berjalan karena www-data memiliki akses tulis yang lebih terbatas.

akhiri edit

Perubahan untuk Systemd

Ini berlaku untuk penggunaan php-fpm, tapi mungkin juga orang lain.

Layanan systemd standar perlu diganti, umask diatur dalam file override.conf, dan layanan restart:

sudo systemctl edit php7.0-fpm.service
Use:
    [Service]
    UMask=0002
Then:
sudo systemctl daemon-reload
sudo systemctl restart php7.0-fpm.service
markdwhite
sumber
3

Ini bekerja untuk saya:

cd [..LARAVEL PROJECT ROOT]
sudo find . -type f -exec chmod 644 {} \;
sudo find . -type d -exec chmod 755 {} \;
sudo chmod -R 777 ./storage
sudo chmod -R 777 ./bootstrap/cache/

Apa fungsinya:

  • Ubah semua izin file menjadi 644
  • Ubah semua izin folder menjadi 755
  • Untuk cache penyimpanan dan bootstrap (folder khusus yang digunakan oleh laravel untuk membuat dan mengeksekusi file, tidak tersedia dari luar) setel izin ke 777, untuk apa pun di dalamnya

Catatan: Mungkin Anda tidak bisa, atau tidak perlu, melakukannya dengan awalan sudo. itu tergantung pada izin pengguna Anda, grup, dll ...

Luca C.
sumber
2

Saya memutuskan untuk menulis skrip saya sendiri untuk meringankan rasa sakit mendirikan proyek.

Jalankan yang berikut di dalam root proyek Anda:

wget -qO- https://raw.githubusercontent.com/defaye/bootstrap-laravel/master/bootstrap.sh | sh

Tunggu bootstrap selesai dan Anda siap melakukannya.

Tinjau skrip sebelum digunakan.

Jonathan
sumber
2

Saya telah menginstal laravel pada contoh EC2 dan telah menghabiskan 3 hari untuk memperbaiki kesalahan izin dan akhirnya memperbaikinya. Jadi saya ingin berbagi pengalaman ini dengan yang lain.

  1. masalah pengguna Ketika saya login contoh ec2, nama pengguna saya adalah pengguna ec2 dan usergroup adalah pengguna ec2. Dan situs web ini bekerja di bawah pengguna httpd: apache: apache jadi kita harus mengatur izin untuk apache.

  2. izin folder dan file A. struktur folder terlebih dahulu, Anda harus memastikan bahwa Anda memiliki struktur folder seperti ini di bawah penyimpanan

    penyimpanan

    • kerangka
      • cache
      • sesi
      • dilihat
    • log Struktur folder dapat berbeda sesuai dengan versi laravel yang Anda gunakan. versi laravel saya adalah 5.2 dan Anda dapat menemukan struktur yang sesuai dengan versi Anda.

B. izin Pada awalnya, saya melihat instruksi untuk mengatur 777 di bawah penyimpanan untuk menghapus file_put_contents: gagal membuka kesalahan aliran. Jadi saya mengatur izin 777 ke penyimpanan chmod -R 777 penyimpanan Tapi kesalahan itu tidak diperbaiki. di sini, Anda harus mempertimbangkan satu: siapa yang menulis file ke penyimpanan / sesi dan tampilan. Itu bukan ec2-user, tetapi apache. Ya benar. "apache" pengguna menulis file (file sesi, file tampilan dikompilasi) ke sesi dan folder tampilan. Jadi, Anda harus memberikan apache untuk menulis izin ke folder ini. Secara default: SELinux mengatakan folder / var / www harus hanya-baca oleh apache deamon.

Jadi untuk ini, kita dapat mengatur selinux sebagai 0: setenforce 0

Ini dapat memecahkan masalah sementara, tetapi ini membuat mysql tidak berfungsi. jadi ini bukan solusi yang sangat baik.

Anda dapat mengatur konteks baca-tulis ke folder penyimpanan dengan: (ingat untuk menetapkan kekuatan 1 untuk mengujinya)

chcon -Rt httpd_sys_content_rw_t storage/

Maka masalah Anda akan diperbaiki.

  1. dan jangan lupa komposer ini memperbarui cache artisan php: hapus

    Perintah-perintah ini akan berguna setelah atau sebelum.

    Saya harap Anda menghemat waktu Anda. Semoga berhasil. Retas

Hacken Lee
sumber
Apakah Anda mencoba memanggil skrip baris perintah dari server Web? Saya mengalami masalah karena tidak mencetak output apa pun
Volatil3
0

Saya memiliki konfigurasi berikut:

  • Nginx (berjalan pengguna: nginx)
  • PHP-FPM

Dan izin diterapkan dengan benar seperti @bgies disarankan dalam jawaban yang diterima. Masalah dalam kasus saya adalah pengguna dan grup berjalan php-fpm yang dikonfigurasikan yang awalnyaapache .

Jika Anda menggunakan NGINX dengan php-fpm, Anda harus membuka file konfigurasi php-fpm:

nano /etc/php-fpm.d/www.config

Dan ganti userdan groupnilai opsi 'dengan satu NGINX dikonfigurasi untuk bekerja dengan; dalam kasus saya, keduanya adalah nginx:

... ; Unix user/group of processes ; Note: The user is mandatory. If the group is not set, the default user's group ; will be used. ; RPM: apache Choosed to be able to access some dir as httpd user = nginx ; RPM: Keep a group allowed to write in log dir. group = nginx ...

Simpan dan mulai kembali layanan nginx dan php-fpm.

Amirreza Nasiri
sumber
0

Untuk pengembang Laravel, masalah direktori bisa sedikit menyakitkan. Dalam aplikasi saya, saya berhasil membuat direktori dengan cepat dan memindahkan file ke direktori ini di lingkungan lokal saya. Kemudian di server, saya mendapatkan kesalahan saat memindahkan file ke direktori yang baru dibuat.

Inilah beberapa hal yang telah saya lakukan dan mendapatkan hasil yang sukses pada akhirnya.

  1. sudo find /path/to/your/laravel/root/directory -type f -exec chmod 664 {} \;
    sudo find /path/to/your/laravel/root/directory -type d -exec chmod 775 {} \;
  2. chcon -Rt httpd_sys_content_rw_t /path/to/my/file/upload/directory/in/laravel/project/
  3. Saat membuat direktori baru dengan cepat, saya menggunakan perintah mkdir($save_path, 0755, true);

Setelah membuat perubahan pada server produksi, saya berhasil membuat direktori baru dan memindahkan file ke sana.

Akhirnya, jika Anda menggunakan File fasad di Laravel, Anda dapat melakukan sesuatu seperti ini: File::makeDirectory($save_path, 0755, true);

Proyek Mycoding
sumber
-1

Saya menemukan solusi yang lebih baik untuk ini. Ini disebabkan karena php berjalan sebagai pengguna lain secara default.

jadi untuk memperbaikinya jangan ini

sudo nano /etc/php/7.0/fpm/pool.d/www.conf

lalu edit user = "put user that owns the directories" group = "put user that owns the directories"

kemudian:

sudo systemctl reload php7.0-fpm

cecil merrel alias bringrainfire
sumber
Jika pengunjung ke halaman web berhasil keluar dari server web, mereka sekarang akan memiliki hak akses "pengguna yang memiliki direktori". Jika pengguna itu adalah data-www, ada sejumlah kerusakan yang dapat mereka lakukan, dan inilah sebabnya apache berjalan sebagai pengguna terbatas. Jika pengguna itu tidak begitu terbatas, mereka dapat melakukan lebih banyak kerusakan. Jika pengguna itu memiliki hak sudo, mereka dapat melakukan lebih banyak kerusakan.
markdwhite
Ini kesepakatan yang sama dengan apache. Btw saya menjalankan nignx seperti anak besar sekarang
cecil merrel alias bringrainfire