Laravel için dosya izinleri nasıl ayarlanır?


234

Ben sahibi ayarlanmış olan Apache Web Sunucusu kullanıyorum _www:_www. Dosya izinleriyle en iyi uygulamanın ne olduğunu asla bilemiyorum, örneğin yeni Laravel 5 projesi oluşturduğumda.

Laravel 5, /storageklasörün yazılabilir olmasını gerektirir . Çalışmasını sağlamak için birçok farklı yaklaşım buldum ve genellikle 777özyinelemeyle chmod yapmakla bitiriyorum. Yine de en iyi fikir olmadığını biliyorum.

Resmi doktor şöyle diyor:

Laravel, bazı izinlerin yapılandırılmasını gerektirebilir : içindeki klasörler storageve vendorweb sunucusu tarafından yazma erişimi gerekir.

Bu, web sunucusunun storageve vendorklasörlerin kendilerine veya yalnızca geçerli içeriklerine erişmesi gerektiği anlamına mı geliyor ?

Çok daha iyi olanın izinler yerine sahibini değiştirdiğini varsayıyorum . Tüm Laravel'in dosya izinlerini özyinelemeli olarak değiştirdim _www:_wwwve siteyi doğru şekilde çalıştırdım, sanki chmod'u değiştirdim 777. Sorun şu ki, metin düzenleyicim herhangi bir dosyayı kaydetmek istediğimde benden şifre istiyor ve aynı şey Finder'da örneğin bir dosyayı kopyalamak gibi bir şeyi değiştirmeye çalışırsam olur.

Bu sorunları çözmek için doğru yaklaşım nedir?

  1. Değişiklik chmod
  2. Dosya sahibini web sunucusununkilerle eşleşecek şekilde değiştirin ve metin düzenleyiciyi (ve Finder?) Şifre sormayı atlayacak şekilde ayarlayın veya kullanmasını sağlayın sudo
  3. Web sunucusunun sahibini os kullanıcısıyla eşleşecek şekilde değiştirin (sonuçlarını bilmiyorum)
  4. Başka bir şey

4
Bence 777çok fazla özgürlük var, çünkü herkes için tüm izinleri içeriyor.
Robo Robok

Laravel belgelerinden: storageve bootstrap/cachedizinler içindeki dizinler web sunucunuz tarafından yazılabilir olmalıdır
joshuamabina

1
fcgi kullanın ve herkes için 755/644 yapabilirsiniz (kamu / depolama dahil)
Jeffz

@jww soruyu beklemeye almak yerine sunucu hatasına taşıyabilir miyiz?
wp78de

Yanıtlar:


588

Bu tartışmayı görüntüleyen herkes için açık olanı belirtmek için .... 777 klasörlerinizden herhangi birine izin verirseniz, HERKES'in bu dizindeki herhangi bir dosyayı okumasına, yazmasına ve yürütmesine izin veriyorsunuz ... bunun anlamı size verilmiş ANYONE (tüm dünyada herhangi bir hacker veya kötü niyetli kişi) HERHANGİ BİR dosya, virüs veya başka bir dosya yükleme izni ve SONRA o dosyayı yürütür ...

KLASÖR İZİNLERİNİZİ 777'YE AYARLANDIYORSANIZ, SUNUCUNUZU BU YÖNETMENİ BULABİLECEK HERKESE AÇTIĞINIZ. Yeterince açık??? :)

Sahipliğinizi ve izinlerinizi ayarlamanın temel olarak iki yolu vardır. Ya kendinize sahiplik verirsiniz ya da web sunucusunu tüm dosyaların sahibi yaparsınız.

Web sunucusu sahibi olarak (çoğu insanın yaptığı gibi ve Laravel doc'ın yolu):

www-data varsayarsak (başka bir şey olabilir) web sunucusu kullanıcınızdır.

sudo chown -R www-veri: www-veri / yol / / / laravel / root / dizininize

bunu yaparsanız, web sunucusu tüm dosyalara sahiptir ve aynı zamanda gruptur ve FTP aracılığıyla dosya yükleme veya dosyalarla çalışma konusunda bazı sorunlarınız olacaktır, çünkü FTP istemciniz web sunucunuz olarak değil, sizin gibi oturum açacaktır. web sunucusu kullanıcı grubuna ekleyin:

sudo usermod -a -G www-veri ubuntu

Tabii ki, bu web sunucunuzun www-data (Homestead varsayılanı) olarak çalıştığını ve kullanıcınızın ubuntu olduğunu (Homestead kullanıyorsanız vagrant) varsayar.

Sonra tüm dizinlerinizi 755 ve dosyalarınızı 644 ... SET dosya izinlerine ayarlayın

sudo find / path / to / your / laravel / root / directory -type f -exec chmod 644 {} \;    

Dizin izinlerini ayarla

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

Sahip olarak kullanıcı

Tüm dizinlere ve dosyalara sahip olmayı tercih ediyorum (her şeyle çalışmayı çok daha kolay hale getiriyor), bu yüzden yapıyorum:

sudo chown -R benim kullanıcı: www-data / path / to / your / laravel / root / dizin

Sonra hem kendime hem de web sunucusu izinlerini veriyorum:

sudo find / path / to / your / laravel / root / directory -tip f -exec chmod 664 {} \;    
sudo find / path / to / your / laravel / root / dizin -tipi d -exec chmod 775 {} \;

Ardından web sunucusuna depolama ve önbelleğe okuma ve yazma hakları verin

Hangi yolu kurarsanız ayarlayın, depolama, önbellek ve web sunucusunun da yüklemesi veya yazması gereken diğer dizinler için web sunucusuna okuma ve yazma izinlerini vermeniz gerekir (durumunuza bağlı olarak), bu yüzden yukarıdaki bashy komutlarını çalıştırın:

sudo chgrp -R www-veri depolama önyükleme / önbellek
sudo chmod -R ug + rwx depolama önyükleme / önbellek

Artık güvendesiniz ve web siteniz çalışıyor ve dosyalarla kolayca çalışabilirsiniz


4
Harika bir örnek, www-data kullanıcısı yoksa, www-data yerine apache: apache kullanın (bazı dağıtımlarda)
Denis Solakovic

53
Bence insanlar anyonekavramı çok fazla yanlış anlıyor . Linux'un anyonebayrağı herhangi bir kullanıcı değil, herhangi bir kullanıcı anlamına gelir . Yine de sunucu erişimine ihtiyacınız var.
Marco Aurélio Deleu

3
@ andreshg112 İlk www verileri kullanıcının adı ve ikinci www verileri grubun adıdır. Yani sahibinin apache ve (bu grup) apache olduğu anlamına gelir. Www-data: www-data kullanın veya kullanıcınızı bu gruba ekleyin. (CLI: useradd -G {grup-adı} kullanıcı adı) ve kullanıcı adına chown yapabileceğinizden daha fazlası: www-group
Denis Solakovic

2
@fs_tigre Güvenlik için çok fazla fark olduğunu düşünmüyorum ... tek bir şifre yerine iki kullanıcı olduğunu tahmin ediyorum ve elbette kullanıcı hesabımla her zaman giriş yapıyorum. Güvenli olmayan bir şekilde yaptım (normal FTP ve örneğin bir şifre kullanarak) siteyi tehlikeye atabilir, ancak sadece Putty ve SSH ile giriş yapıyorum ve FTP kullandığımda SFTP, bu yüzden hiç sorun yok. Yapışkan biti ayarladıkları için bashy tarafından önerilen komutlar önerilir, bu nedenle web sunucunuz alt dizinler oluşturursa, üst
öğe ile

3
İlk yöntemde, writegruba izin vermediğiniz için kullanıcı dosya yükleyemez mi?
Fahmi

44

Güvenlik nedenlerinden ötürü storageve vendorklasörlerinin izinleri burada kalmalıdır 775.

Ancak, hem bilgisayarınızın hem de sunucunuzun Apache'nin bu klasörlere yazabilmesi gerekir. Örn: gibi komutları çalıştırdığınızda php artisan, bilgisayarınızın içindeki günlükler dosyasına yazması gerekir storage.

Tek yapmanız gereken klasörlerin sahipliğini Apache'ye vermektir:

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

Daha sonra bilgisayarınızı (başvurduğu username) Apache sunucusunun ait olduğu gruba eklemeniz gerekir . Şöyle ki:

sudo usermod -a -G www-data userName

NOT: Çoğu zaman groupName, www-dataancak sizin durumunuzda,_www


10
+1 Bu yaklaşımı seviyorum. Ama chownkomutların -R bayrağını içermesi gerektiğine inanıyorum . Ayrıca, laravel 5.1 ve 5.2'de, satıcı dizini yerine, bootstrap / cache dizinine erişim vermelisiniz.
Jason Wheeler

bunun işe yarayıp yaramayacağını test etmenin bir yolu var mı? Yani yeni günlük dosyası depolama / günlükler dizininde oluşturulmuşsa doğru izinlere sahip olup olmadığını nasıl kontrol edebilirim?
Chaudhry Waqas

20

Laravel uygulamaları için izinler ayarlarken birçok son durumla karşılaştık. deployLaravel uygulama klasörüne sahip olmak ve Laravel komutlarını CLI'den yürütmek için ayrı bir kullanıcı hesabı ( ) oluşturuyoruz ve altında web sunucusunu çalıştırıyoruz www-data. Bunun neden olduğu bir sorun, günlük dosyalarının sahip olabileceği www-dataveya deployilk olarak günlük dosyasına kimin yazdığına bağlı olarak, diğer kullanıcının gelecekte yazmasını engelleyebileceğidir.

Tek aklı başında ve güvenli çözümün Linux ACL'leri kullanmak olduğunu gördüm. Bu çözümün amacı:

  1. Uygulamanın sahibi olan / dağıtan kullanıcının Laravel uygulama koduna okuma ve yazma erişimine izin vermek için (adlı bir kullanıcı kullanıyoruz deploy).
  2. www-dataKullanıcının Laravel uygulama koduna erişimi okumasına izin vermek , ancak yazma erişimini sağlamak için.
  3. Diğer kullanıcıların Laravel uygulama koduna / verilerine erişmesini önlemek için.
  4. Hem www-datakullanıcıya hem de uygulama kullanıcısına izin vermek için (deploy kullanıcı dosyanın sahibi (hem böylece hangi bakılmaksızın depolama klasörüne) yazma erişimi, deployve www-dataörneğin aynı günlük dosyasına yazabilirsiniz).

Bunu aşağıdaki gibi gerçekleştiriyoruz:

  1. application/Klasördeki tüm dosyalar varsayılan umask ile oluşturulur0022 , bu da drwxr-xr-xizinlere ve klasörlere sahip klasörlerle sonuçlanır -rw-r--r--.
  2. sudo chown -R deploy:deploy application/ (veya uygulamanızı yalnızca deploy kullanıcı yaptığımız budur).
  3. chgrp www-data application/ vermek www-datagruba uygulamaya erişim .
  4. chmod 750 application/ izin vermek deploykullanıcının okuma / yazma salt okunur www-datakullanıcı ve diğer kullanıcılara yönelik tüm izinleri kaldırması.
  5. setfacl -Rdm u:www-data:rwx,u:deploy:rwx application/storage/storage/klasör ve tüm alt klasörlerdeki varsayılan izinleri ayarlamak için . Depolama klasöründe oluşturulan tüm yeni klasörler / dosyalar bu izinleri devralır ( rwxher ikisi içinwww-data ve deploy).
  6. setfacl -Rm u:www-data:rwX,u:deploy:rwX application/storage/ varolan dosyalarda / klasörlerde yukarıdaki izinleri ayarlamak için.

15

Dizinin sahibi olan gruptaki herhangi bir kullanıcı için (sizin durumunuzda _www) okuma / yazma / yürütme özelliğini etkinleştirmek için proje klasörünüzün izinlerini değiştirin :

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

Ardından _wwwdizine erişmesine izin vermek için OS X kullanıcı adınızı gruba ekleyin :

sudo dseditgroup -o edit -a yourusername -t user _www

Ben ne zaman dseditgroupsenin tarafından sağlanan, bir hata alıyorum: Username and password must be provided..
Robo Robok

Benim hatam, bu komutu uygun izinlere sahip bir kullanıcıyla çalıştırmanız gerekir, bu yüzden sudobaşlangıçta ekleyin .
Bogdan

Bu dosyaların sahibini _www:_wwwveya myuser:_wwwolarak değiştirmem gerekiyor mu?
Robo Robok

Sen bırakabilirsiniz _www:_wwwgrubunda 775 araç herhangi bir kullanıcı, çünkü _wwwo klasördeki / yazma / exect okumak için tüm izinlere sahip olacak ve sadece bu gruba adınızı ekledi.
Bogdan

Bana bir şey söyleyebilir misin? Bu ne anlama geliyor chown myuser:_www? İlki kullanıcı, ikincisi grup olduğunu biliyorum, ama "bu kullanıcı VE bu gruptan HERKES" veya "bu kullanıcı SADECE bu gruba AİTTİRSE" anlamına mı geliyor?
Robo Robok

8

Daha önce yayınlandığı gibi

Tek yapmanız gereken klasörlerin sahipliğini Apache'ye vermektir:

ama chown komutu için -R ekledim : sudo chown -R www-data:www-data /path/to/your/project/vendor sudo chown -R www-data:www-data /path/to/your/project/storage


3
Satıcı dizinine neden izin vermemiz gerekiyor? Depolama mantıklı, günlük dosyalarına yazmak vb. İçin. Ama satıcı? neden?
Ali Haris

Yukarıda bazı yorumlarda yazıldığı gibi: "Ancak, hem bilgisayarınızın hem de sunucunuzun Apache'nin bu klasörlere yazabilmesi gerekir. Örn: php artisan gibi komutları çalıştırdığınızda, bilgisayarınızın depolama alanındaki günlük dosyasına yazması gerekir."
Stanislav Potapenko

Mac'te hata: chown: www-data: illegal grup adı
Sunil Kumar


7

Klasörlerin çoğu normal "755" ve "644" dosyaları olmalıdır.

Laravel, bazı klasörlerin web sunucusu kullanıcısı için yazılabilir olmasını gerektirir. Bu komutu unix tabanlı işletim sistemlerinde kullanabilirsiniz.

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

7

Composer.json'a ekle

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

Sonra composer install


2
Bu kötü bir cevap. Web sunucusunu doğru şekilde yapılandırdıysanız, hiçbir zaman herhangi bir klasör için 777 kullanmanız gerekmez. 777 kullanmak sunucunuzu herhangi bir bilgisayar korsanının bir dosya yüklemesi için açar ve klasörün nerede olduğunu biliyorlarsa söz konusu dosyayı yürütür.
mbozwood

2
Tamam. Teklifin nedir?
Davron Achilov

Ve eğer öyleyse, doğru olacak mı? chown -R $ USER: www-veri depolama, chown -R $ USER: www-data bootstrap / önbellek
Davron Achilov

Doğru cevaba bakın, kesinlikle güncelleme sonrası koyabileceğiniz tüm gerekli bilgileri içerir :)
mbozwood

6

Laravel 5.4 dokümanlar ki:

Laravel'i yükledikten sonra, bazı izinleri yapılandırmanız gerekebilir. İçinde Dizinler storageve bootstrap/cachedizinlere web sunucusu tarafından yazılabilir olmalıdır veya laravel yayınlanmaz. Homestead sanal makinesini kullanıyorsanız, bu izinlerin önceden ayarlanmış olması gerekir.

Bu sayfada 777izinlerin kullanılmasından bahseden birçok cevap var . Bunu yapma. Sen olurdum kendinizi teşhir korsanların.

Bunun yerine, 755 (veya daha kısıtlayıcı) izinlerin nasıl ayarlanacağına ilişkin başkalarının önerilerini izleyin. whoamiTerminalde çalışarak uygulamanızın hangi kullanıcıyı çalıştırdığını anlamanız ve ardından belirli dizinlerin sahipliğini değiştirmeniz gerekebilir.chown -R .

Kullanma izniniz yoksa sudoDiğer yanıtların gerektirdiği kadar ...

Sunucunuz muhtemelen Cloudways gibi paylaşılan bir ana makinedir.

(Benim durumumda, Laravel uygulamamı ikinci bir Cloudways sunucuma kopyaladım ve tamamen çalışmadı çünkü storagevebootstrap/cache dizinlerin dizinlerin .)

Kullanmam gerekiyordu:

Cloudways Platform > Server > Application Settings > Reset Permission

Sonra php artisan cache:clearterminalde koşabilirdim .


4

Bgles tarafından gönderilen çözüm, başlangıçta izinlerin doğru ayarlanması açısından bana göre (ikinci yöntemi kullanıyorum), ancak yine de Laravel için potansiyel sorunları var.

Apache varsayılan olarak 644 izinli dosyalar oluşturur. Bu depolamada hemen hemen her şey. Bu nedenle, depolama / çerçeve / görünümlerin içeriğini silerseniz, bir sayfaya Apache üzerinden erişirseniz, önbelleğe alınmış görünümün aşağıdaki gibi oluşturulduğunu göreceksiniz:

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

"Esnaf hizmetini" çalıştırır ve farklı bir sayfaya erişirseniz CLI PHP'nin Apache'den farklı davrandığı için farklı izinler alırsınız:

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

Kendi başına bu hiç önemli değil çünkü üretimde bunların hiçbirini yapmayacaksınız. Ancak Apache daha sonra kullanıcı tarafından yazılması gereken bir dosya oluşturursa başarısız olur. Bu , oturum açmış bir kullanıcı ve esnaf kullanarak dağıtırken önbellek dosyaları, önbelleğe alınmış görünümler ve günlükler için de geçerlidir. Www-data: www-data 644 önbellek dosyalarını silmeyecek olan "zanaatkar önbellek: temizle" gibi kolay bir örnek.

Bu, esnaf komutlarını www-data olarak çalıştırarak kısmen azaltılabilir, bu nedenle aşağıdaki gibi her şeyi yaparsınız / komut dosyası yazarsınız:

sudo -u www-data php artisan cache:clear

Ya da bunun sıkıcılığından kaçınacak ve bunu .bash_aliases'ınıza ekleyeceksiniz:

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

Bu yeterince iyidir ve güvenliği hiçbir şekilde etkilemez. Ancak, phpunit'i çalıştırmak için 'sudo -u www-data' kullanmak için takma adlar ayarlamak istemediğiniz sürece geliştirme makinelerinde, test ve sanitasyon komut dosyalarını çalıştırmak bu hantal değildir.

Çözüm, bgles tavsiyesinin ikinci bölümünü takip etmek ve / etc / apache2 / envvars'a aşağıdakileri eklemek ve Apache'yi yeniden başlatmak (yeniden yüklememek):

umask 002

Bu, Apache'yi varsayılan olarak 664 olarak dosya oluşturmaya zorlar. Kendi başına, bu bir güvenlik riski oluşturabilir. Ancak, çoğunlukla burada tartışılan Laravel ortamlarında (Homestead, Vagrant, Ubuntu) web sunucusu, www-data grubu altında kullanıcı www-data olarak çalışır. Dolayısıyla, kullanıcıların keyfi olarak www-data grubuna katılmasına izin vermezseniz, ek bir risk olmamalıdır. Birisi web sunucusundan çıkmayı başarırsa, yine de www-veri erişim seviyesine sahiptir, bu yüzden hiçbir şey kaybolmaz (ancak bu, güvenlikle ilgili olarak en iyi tutum değildir). Bu nedenle üretimde nispeten güvenlidir ve tek kullanıcılı bir geliştirme makinesinde bu bir sorun değildir.

Nihayetinde kullanıcınız www-veri grubunda olduğundan ve bu dosyaları içeren tüm dizinler g + s'dir (dosya her zaman üst dizin grubu altında oluşturulur), kullanıcı veya www-data tarafından oluşturulan her şey r / w diğeri için.

Ve buradaki amaç bu.

Düzenle

İzinleri daha da ayarlamak için yukarıdaki yaklaşımı araştırırken, yine de yeterince iyi görünüyor, ancak birkaç ayar yardımcı olabilir:

Varsayılan olarak, dizinler 775 ve dosyalar 664'tür ve tüm dosyalar, çerçeveyi yeni yükleyen kullanıcının sahibi ve grubuna sahiptir. Diyelim ki o noktadan başlıyoruz.

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

Yaptığımız ilk şey, herkese erişimi engellemek ve grubun www-veri olmasını sağlamaktır. Dizine yalnızca www verilerinin sahibi ve üyeleri erişebilir.

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

Web sunucusunun resmi Laravel kurulum kılavuzu tarafından önerildiği gibi services.json ve compiled.php oluşturmasına izin vermek için. Grup yapışkan bitinin ayarlanması, bunların bir grup www verisine sahip içerik oluşturucuya ait olacağı anlamına gelir.

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

Önbellek, günlük, oturum ve görüntüleme dosyalarının oluşturulmasına izin vermek için depolama klasöründe de aynı şeyi yaparız. Find dizinini, dizinler ve dosyalar için dizin izinlerini açıkça farklı bir şekilde ayarlamak için kullanırız. Bunu (normalde) herhangi bir alt dizin olmadığı için bootstrap / cache'de yapmamız gerekmiyordu.

Phpunit ve diğerlerinin bağlantılarını yeniden oluşturmak için yürütülebilir bayrakları yeniden uygulamanız ve satıcı / * silmeniz ve besteci bağımlılıklarını yeniden yüklemeniz gerekebilir;

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

Bu kadar. Yukarıda açıklanan Apache için umask dışında, tüm proje kökünü www-data ile yazılabilir hale getirmeden gereken tek şey budur, diğer çözümlerle olan şey budur. Bu nedenle, www-data olarak çalışan bir davetsiz misafirin daha sınırlı yazma erişimine sahip olması marjinal olarak daha güvenlidir.

düzenlemeyi bitir

Systemd'deki değişiklikler

Bu php-fpm, ama belki diğerleri için de geçerlidir.

Standart systemd hizmetinin geçersiz kılınması, override.conf dosyasında umask ayarlanması ve hizmetin yeniden başlatılması gerekir:

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

3

Bu benim için çalıştı:

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/

Bu ne yapar:

  • Tüm dosya izinlerini 644 olarak değiştir
  • Tüm klasör izinlerini 755 olarak değiştir
  • Depolama ve önyükleme önbelleği için (laravel tarafından dosya oluşturmak ve yürütmek için kullanılan özel klasörler, dışarıdan kullanılamaz) içindeki her şey için 777'ye izin verin

Not: Belki bunu sudo önekiyle yapamazsınız veya ihtiyacınız yoktur. bu, kullanıcının izinlerine, gruba vb. bağlıdır.


2

Proje kurmanın acılarını hafifletmek için kendi senaryomu yazmaya karar verdim.

Proje kökü içinde aşağıdakileri çalıştırın:

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

Önyükleme işleminin tamamlanmasını bekleyin ve hazırsınız.

Kullanmadan önce komut dosyasını inceleyin .


2

EC2 örneğine laravel yükledim ve izin hatasını düzeltmek için 3 gün geçirdim ve sonunda düzelttim. Bu deneyimi başka biriyle paylaşmak istiyorum.

  1. kullanıcı sorunu ec2 örneğinde oturum açtığımda, kullanıcı adım ec2 kullanıcısı ve kullanıcı grubu ec2 kullanıcısı. Ve web sitesi httpd user: apache: apache altında çalışır, bu yüzden apache için izin ayarlamalıyız.

  2. klasör ve dosya izni A. klasör yapısı önce, depolama altında böyle bir klasör yapısına sahip olduğunuzdan emin olmalısınız

    depolama

    • iskelet
      • önbellek
      • oturumları
      • Görüntüleme
    • günlükler Klasör yapısı kullandığınız laravel sürümüne göre farklı olabilir. benim laravel versiyonum 5.2 ve versiyonunuza göre uygun yapıyı bulabilirsiniz.

B. izin İlk başta, file_put_contents kaldırmak için depolama altında 777 ayarlamak için talimatları görüyorum: akış hatası açılamadı. Bu yüzden depolama chmod -R 777 depolama izin 777 kur Ama hata düzeltilmedi. burada birini düşünmelisiniz: dosyaları depolama / oturumlara ve görünümlere kim yazar? Bu ec2 kullanıcısı değil, apache. Evet doğru. "apache" kullanıcı oturumu ve görüntüleme klasörüne dosya (oturum dosyası, derlenmiş görünüm dosyası) yazar. Bu nedenle, bu klasöre yazma izni için apache vermelisiniz. SELinux, varsayılan olarak / var / www klasörünün apache deamon tarafından salt okunur olması gerektiğini söylüyor.

Bunun için selinux'u 0 olarak ayarlayabiliriz: setenforce 0

Bu, sorunu geçici olarak çözebilir, ancak bu mysql'in çalışmamasını sağlar. yani bu çok iyi bir çözüm değil.

Depolama klasörüne aşağıdakilerle bir okuma-yazma bağlamı ayarlayabilirsiniz: (test etmek için 1'i ayarlamayı unutmayın)

chcon -Rt httpd_sys_content_rw_t storage/

O zaman probleminiz çözülecek.

  1. ve bu besteci güncelleme php esnaf önbellek unutmayın: temizle

    Bu komutlar sonra veya sonra faydalı olacaktır.

    Umarım zaman kazanırsınız. İyi şanslar. Hacken


Web sunucusundan bir komut satırı komut dosyası çağırmayı denediniz mi? Herhangi bir çıktı yazdırmaz gibi sorun yaşıyorum
Volatil3

0

Aşağıdaki yapılandırmaya sahiptim:

  • Nginx (kullanıcıyı çalışan: nginx)
  • PHP-FPM

Ve kabul edilen cevapta @bgies önerilen izinleri doğru şekilde uyguladı. Benim durumumda sorun php-fpm yapılandırılmış çalışan kullanıcı ve orijinal grup oldu apache.

Php-fpm ile NGINX kullanıyorsanız, php-fpm'nin config dosyasını açmalısınız:

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

Ve bir NGINX ile değiştirin userve groupseçeneklerin değeri ile çalışmak üzere yapılandırılır; benim durumumda, ikisi de vardı 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 ...

Kaydedin ve nginx ve php-fpm hizmetlerini yeniden başlatın.


0

Laravel geliştiricileri için, dizin sorunları biraz acı olabilir. Uygulamamda anında dizinler oluşturdum ve dosyaları yerel ortamımda bu dizine başarıyla taşıyordum. Sonra sunucuda, dosyaları yeni oluşturulan dizine taşırken hata alıyordum.

İşte yaptığım ve sonunda başarılı bir sonuç elde ettiğim şeyler.

  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. Yeni dizini anında oluştururken, mkdir($save_path, 0755, true);

Üretim sunucusunda bu değişiklikleri yaptıktan sonra başarıyla yeni dizinler oluşturdum ve dosyaları onlara taşıdım.

Son olarak, Laravel'de Dosya cephesi kullanıyorsanız, böyle bir şey yapabilirsiniz: File::makeDirectory($save_path, 0755, true);


-1

Buna daha iyi bir çözüm buldum. Php varsayılan olarak başka bir kullanıcı olarak çalıştığı için neden olur.

bunu düzeltmek için

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

sonra düzenle user = "put user that owns the directories" group = "put user that owns the directories"

sonra:

sudo systemctl reload php7.0-fpm


Eğer web sayfasına ziyaretçi web sunucusu arasında patlak başarır bunlar artık "dizinleri sahibi olan kullanıcı" erişim haklarına sahip olacak. Bu kullanıcı www-verisi ise, yapabileceği sınırlı miktarda hasar vardır ve bu yüzden apache sınırlı bir kullanıcı olarak çalışır. Bu kullanıcı bu kadar sınırlı değilse, daha fazla hasar verebilir. Bu kullanıcının sudo hakları varsa, çok daha fazla hasar verebilir.
markdwhite

Apache ile aynı şey. BTW Şimdi büyük bir çocuk gibi nignx çalıştırın
cecil merrel aka bringrainfire
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.