• Время чтения ~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 предоставляет разрешения на чтение и выполнение другим пользователям. Помните, что разрешения на выполнение для каталогов означают, что пользователю разрешено войти в каталог

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 диска and 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