• Czas czytania ~6 min
  • 17.02.2024

Ustawienie prawidłowych uprawnień do plików dla Laravela jest zaskakująco trudne. Jeśli uruchamiasz Laravela na serwerze, który sam udostępniłeś, prawdopodobnie miałeś spory udział w błędach uprawnień do plików.

W przeszłości postępowałem zgodnie z innymi przewodnikami online, jak ustawić prawidłowe uprawnienia do plików. Za każdym razem, gdy to robiłem, kończyło się to nieprzewidywalnymi błędami. Jak się okazuje, wszystkie rozwiązania, które mogę znaleźć w Internecie, nie są do końca poprawne. Rozwiązują tylko niektóre problemy, ale nie wszystkie.

W tym poście udokumentowałem, jak ustawić prawidłowe uprawnienia do plików dla Laravela.

Zmienne w tym poście są dynamiczne. Możesz je edytować poniżej, aby dopasować je do wartości swojego serwera. Po ustawieniu możesz skopiować i wkleić polecenia bash w tym poście bezpośrednio do terminala.

Należy użyć ścieżki bezwzględnej.

Nie można użyć znaku "~" w tej ścieżce.

Dlaczego zdarzają się

błędy uprawnień do plików Błędy uprawnień do plików występują, ponieważ dwóch różnych użytkowników tworzy pliki i katalogi w projekcie. Kod jest wdrażany przy użyciu użytkownika "sjors". Prawdopodobnie uruchamiasz również cron i procesy kolejkowe z użytkownikami "sjors". Twój Nginx/Apache2 używa "www-data" użytkownika do obsługi żądań internetowych.

Na przykład użytkownik "sjors" tworzy laravel.log plik. Ten plik należy teraz do użytkownika "sjors", a także należy do grupy "sjors". Później użytkownik "www-data" również chce zapisywać do dziennika. Ale "www-data" nie jest właścicielem pliku i nie jest częścią grupy, więc nie może zapisywać do pliku. To powoduje The stream or file "/var/www/project/​storage/​logs/​laravel.log" could not be opened in append mode: Failed to open stream: Permission denied błąd.

Katalog bootstrap/cache jest kolejnym źródłem problemów. Użytkownik "sjors" tworzy ten katalog podczas wdrożeń. Użytkownik "www-data" musi tworzyć pliki w tym katalogu, ale nie ma uprawnień do zapisu w tym katalogu. Powoduje to, że Laravel zgłasza The /var/www/project/​bootstrap/​cache directory must be present and writable błąd.

Jak rozwiązać problemy z

uprawnieniami do plików Tak więc problem wynika z używania dwóch użytkowników, którzy nie są w tej samej grupie. Rozwiązanie tego problemu wydaje się dość proste, wystarczy dodać obu użytkowników do tej samej grupy. Jak zwykle rozwiązanie nie jest takie proste. Pliki i katalogi domyślnie nie uzyskują uprawnień do zapisu grupowego. Więc nawet jeśli obaj są w tej samej grupie, nadal będziesz mieć te same problemy.

Kluczem do naprawienia tych błędów uprawnień do plików jest upewnienie się, że pliki i katalogi domyślnie uzyskują uprawnienia do zapisu grupowego. Poniższe kroki wyjaśnią, jak to osiągnąć.

Wszystkie polecenia w tym poście używają sudo. Twój użytkownik "www-data" prawdopodobnie utworzył już pliki i katalogi. Jedynym sposobem na zmianę ich uprawnień jest użycie sudo.

Krok 1: Dodaj swojego użytkownika do grupy

"www-data" Przede wszystkim musimy dodać naszego użytkownika "sjors" do grupy "www-data":

sudo usermod -aG "www-data" "sjors"

Krok 2: Ustaw ustawienia domyślne dla nowych plików za pomocą setfacl

Nowe pliki nie mają domyślnie uprawnień do zapisu grupowego. Możemy użyć setfacl do zmiany tych ustawień domyślnych. Jeśli setfacl nie jest zainstalowany na serwerze, możesz go zainstalować za pomocą sudo apt install acl. Aby domyślnie nadać nowym plikom uprawnienia do zapisu w grupie, uruchom następujące polecenie:

sudo find -L "/var/www/project" -type d -not -path "*/vendor/*" -not -path "*/node_modules/*" -exec setfacl --default -m g::rwX {} \;

Krok 3: Ustaw istniejące pliki na 664

Powyższe setfacl polecenie domyślnie daje uprawnienia 664 do nowych plików. Mamy również możliwość zmiany uprawnień istniejących plików na 664. 66 nadaje uprawnienia do odczytu i zapisu właścicielowi i grupie. 4 daje innym użytkownikom uprawnienia do odczytu. Pliki nie wymagają uprawnień do wykonywania, więc nie nadajemy im żadnych.

sudo find -L "/var/www/project" -type f -not -path "*/vendor/*" -not -path "*/node_modules/*" -exec chmod 664 {} \;

Krok 4: Zmień właściciela i grupę istniejących plików

Wszystkie pliki powinny należeć do użytkownika "sjors". Grupa wszystkich plików powinna być ustawiona na "www-data".

sudo find -L "/var/www/project" -type f -not -path "*/vendor/*" -not -path "*/node_modules/*" -exec chown "sjors":"www-data" {} \;

Krok 5: Ustaw istniejące katalogi na 2775

Ustawiamy uprawnienia wszystkich istniejących katalogów na 2775. Wartość 2, zwana także bitem setgid, powoduje, że wszystkie nowe katalogi dziedziczą grupę swojego katalogu nadrzędnego. Bez setgid, katalogi utworzone przez "sjors" nie będą mogły być zapisywane przez "www-data".

77 nadaje uprawnienia do odczytu, zapisu i wykonywania właścicielowi i grupie. 5 daje uprawnienia do odczytu i wykonywania innym użytkownikom. Pamiętaj, że uprawnienia do wykonywania katalogów oznaczają, że użytkownik może "cd" wejść do katalogu.

sudo find -L "/var/www/project" -type d -not -path "*/vendor/*" -not -path "*/node_modules/*" -exec chmod 2775 {} \;

Krok 6: Zmień właściciela i grupę istniejących katalogów

Wszystkie istniejące katalogi powinny należeć do użytkownika "sjors". Grupa wszystkich istniejących katalogów powinna być ustawiona na "www-data".

sudo find -L "/var/www/project" -type d -not -path "*/vendor/*" -not -path "*/node_modules/*" -exec chown "sjors":"www-data" {} \;

Krok 7: Ustaw domyślne uprawnienia w pliku filesystems.php

konfiguracyjnym To ostatni element układanki. Musimy ustawić uprawnienia dla local dysku i public w filesystems.php pliku konfiguracyjnym. Jeśli nie ustawimy tych uprawnień, katalogi utworzone przez fasadę nie otrzymają uprawnień do zapisu Storage grupowego.

Edytuj filesystems.php plik konfiguracyjny i ustaw uprawnienia publiczne na 0775:

'disks' => [
    'local' => [
        'driver' => 'local',
        'root' => storage_path('app'),
        'permissions' => [
            'file' => [
                'public' => 0775,
                'private' => 0600,
            ],
            'dir' => [
                'public' => 0775,
                'private' => 0700,
            ],
        ],
    ],
    'public' => [
        'driver' => 'local',
        'root' => storage_path('app/public'),
        'url' => env('APP_URL').'/storage',
        'visibility' => 'public',
        'permissions' => [
            'file' => [
                'public' => 0775,
                'private' => 0600,
            ],
            'dir' => [
                'public' => 0775,
                'private' => 0700,
            ],
        ],
    ],
],

Uprawnienia do plików po nowym wdrożeniu

Po wdrożeniu nowego kodu należy ponownie ustawić poprawne uprawnienia do plików. Nowo wdrożone pliki nie odziedziczą wartości domyślnych, które ustawiliśmy wcześniej. Kroki od 2 do 6 należy powtórzyć po każdym wdrożeniu.

Jeśli chcesz zautomatyzować swoje wdrożenie, sprawdź mój skrypt wdrożeniowy Laravel. Ten skrypt uruchamia doskonałe wdrożenie i gwarantuje, że nie wystąpią żadne problemy z uprawnieniami do plików.

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

O

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

O autorze CrazyBoy49z
WORK EXPERIENCE
Kontakt
Ukraine, Lutsk
+380979856297