• Час читання ~1 хв
  • 17.02.2024

Встановлення правильних прав доступу до файлів для Laravel напрочуд складне. Якщо ви запускаєте Laravel на сервері, який ви підготували самостійно, то, ймовірно, у вас була неабияка частка помилок дозволів на доступ до файлів.

Раніше я дотримувався інших онлайн-посібників про те, як встановити правильні дозволи на доступ до файлів. Щоразу, коли я це робив, я все одно отримував непередбачувані помилки. Як виявилося, всі рішення, які я можу знайти в Інтернеті, не зовсім правильні. Вони вирішують лише частину проблем, але не всі.

У цій публікації я задокументував, як встановити правильні права доступу до файлів для Laravel.

Змінні в цій публікації динамічні. Ви можете відредагувати їх нижче, щоб вони відповідали значенням вашого сервера. Після встановлення ви можете скопіювати та вставити команди bash у цьому записі прямо у ваш термінал.

Слід використовувати абсолютний шлях.

Ви не можете використовувати "~" у цьому шляху.

Чому трапляються

помилки дозволів на доступ до файлів Помилки дозволів на доступ до файлів виникають через те, що у вашому проекті створюють файли та каталоги два різні користувачі. Ви розгортаєте свій код за допомогою "sjors" користувача. Ви, ймовірно, також запускаєте cron і queue workers з користувачем "sjors". Ваш Nginx/Apache2 використовує "www-data" користувача для обслуговування веб-запитів.

Наприклад, файл створює користувач "sjors". laravel.log Цей файл тепер належить користувачеві "sjors", а також належить до групи "sjors". Пізніше користувач "www-data" також захоче записати в журнал. Але "www-data" не є власником файлу і не є частиною групи, тому йому заборонено записувати файл. Це спричиняє помилку The stream or file "/var/www/project/​storage/​logs/​laravel.log" could not be opened in append mode: Failed to open stream: Permission denied .

Каталог bootstrap/cache є ще одним джерелом проблем. Користувач "sjors" створює цей каталог під час розгортання. Користувач "www-data" повинен створювати файли всередині цього каталогу, але не має прав на запис для каталогу. Це призводить до того, що Laravel видає The /var/www/project/​bootstrap/​cache directory must be present and writable помилку.

Як вирішити проблеми

з дозволами на доступ до файлів Отже, проблема пов'язана з використанням двох користувачів, які не належать до однієї групи. Рішення цієї проблеми звучить досить просто, достатньо додати обох користувачів в одну групу. Як завжди, рішення не таке просте. Файли та каталоги за замовчуванням не отримують дозволів на груповий запис. Таким чином, навіть якщо обидва знаходяться в одній групі, у вас все одно будуть однакові проблеми.

Ключ до виправлення цих помилок дозволу на доступ до файлів полягає в тому, щоб переконатися, що файли та каталоги отримують дозволи на груповий запис за замовчуванням. Наведені нижче кроки пояснять, як цього досягти.

У всіх командах цього поста використовується sudo. Ваш користувач "www-data", ймовірно, вже створив файли та каталоги. Єдиним способом зміни прав доступу є використання sudo.

Крок 1: Додайте свого користувача до групи

"www-data" Перш за все, ми повинні додати нашого користувача "sjors" до групи "www-data":

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

Крок 2: Встановіть значення за замовчуванням для нових файлів за допомогою setfacl

Нові файли за замовчуванням не мають групових прав на запис. Ми можемо використовувати setfacl для зміни цих типових значень. Якщо setfacl його не встановлено на вашому сервері, ви можете інсталювати його за допомогою sudo apt install aclкнопки . Щоб надати новим файлам дозволи на запис за замовчуванням, виконайте таку команду:

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

Крок 3: Встановіть для наявних файлів значення 664

Наведена setfacl вище команда за замовчуванням надає 664 дозволи на нові файли. Ми також змінили права доступу до існуючих файлів на 664. 66 надає права на читання і запис власнику і групі. 4 надає іншим користувачам дозволи на читання. Файли не потребують дозволів на виконання, тому ми не надаємо їм їх.

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

Крок 4: Змініть власника та групу наявних файлів

Усі файли мають належати користувачеві "sjors". Для групи всіх файлів слід встановити значення "www-data".

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

Крок 5: Встановіть існуючі каталоги на 2775

Ми встановлюємо дозволи для всіх існуючих каталогів на 2775. Число 2, також зване бітом setgid, змушує всі нові каталоги успадковувати групу батьківського каталогу. Без setgid каталоги, створені за допомогою "sjors", не можна буде записувати за допомогою "www-data".

77 надає дозволи на читання, запис і виконання власнику та групі. 5 надає дозволи на читання та виконання іншим користувачам. Пам'ятайте, що права доступу на виконання для каталогів означають, що користувачеві дозволено "cd" увійти до каталогу.

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

Крок 6: Змініть власника та групу існуючих каталогів Усі

існуючі каталоги мають належати користувачеві "sjors". Для групи всіх існуючих каталогів слід встановити значення "www-data".

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

Крок 7: Встановіть дозволи за замовчуванням у вашому filesystems.php конфігураційному файлі

Це остання частина головоломки. Ми повинні встановити права доступу для диска local і public в конфігураційному файлі filesystems.php . Якщо ми не встановимо ці дозволи, каталоги, створені фасадом Storage , не отримуватимуть прав на груповий запис.

Відредагуйте файл filesystems.php конфігурації та встановіть загальнодоступні дозволи на 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,
            ],
        ],
    ],
],

Дозволи на файли після нового розгортання

Після розгортання нового коду вам потрібно знову встановити правильні дозволи на файл. Щойно розгорнуті файли не успадковуватимуть значення за замовчуванням, які ми встановили раніше. Ви повинні повторювати кроки з 2 по 6 після кожного розгортання.

Якщо ви хочете автоматизувати розгортання, ознайомтеся з моїм сценарієм розгортання Laravel. Цей скрипт ідеально працює і гарантує, що у вас не виникне проблем з дозволами на доступ до файлів.

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

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

Про автора CrazyBoy49z
WORK EXPERIENCE
Контакти
Ukraine, Lutsk
+380979856297