Как исправить ошибку: Laravel storage permission denied

После развертывания нового проекта или выполнения команд на сервере вы можете столкнуться с ошибкой отказа в разрешении в Laravel, когда он пытается записать логи или кеш. Эту проблему вызывают неправильно настроенные права на запись или владение каталогом хранения.

Как исправить Laravel storage permission denied в Laravel

Во-первых, давайте посмотрим, почему возникает эта ошибка. Обычно при установке Laravel вы запускаете команды установки от имени пользователя, с которым вы вошли в систему, или от имени пользователя root. В этом случае все файлы и каталоги, созданные командой установки, будут принадлежать этому пользователю. Чтобы понять, почему это вызывает проблему, вы должны понять, как работают разрешения Linux.

В Linux права доступа к файлам и папкам применяются к владельцу файла, группе пользователей, которой принадлежит файл, и всем остальным пользователям. Подробно об этом можно прочитать в документации RedHat . Каждая программа в системе запускается конкретным пользователем и имеет те же права доступа к файлам, что и пользователь. По умолчанию в Linux только владелец файла и группа, владеющая файлом, имеют право на запись в файл. Однако веб-сервер Apache или PHP-FPM почти никогда не запускается с правами root. В большинстве случаев это специальный пользователь с именем www-data . Поэтому интерпретатор PHP и все выполняемые им скрипты считаются «другими» и могут только читать файлы Laravel, но не могут записывать данные.

В идеале все файлы Laravel должны принадлежать пользователю, под именем которого запущен интерпретатор PHP. Однако это необязательно. Приложениям Laravel требуется только доступ на запись к папке хранилища. Здесь хранятся файлы кэша, журналы и файлы, загруженные пользователем.

Вы можете проверить, какой пользователь используется для запуска php-fpm, с помощью утилиты ps в Linux:

ps aux | grep php-fpm

Существует один главный процесс, который запускается пользователем root, и два рабочих процесса, запускаемые www-data . Если вы хотите проверить, какие разрешения в данный момент установлены для файлов и папок в каталоге хранения, используйте команду ls с опцией -l . Выполните его в папке проекта:

ls -l storage/

Разрешения отображаются в виде трех групп: rwx, rwx и rx ( r – Чтение, w – Запись, x – Выполнение).

Это означает, что в приведенном выше примере пользователь haait имеет разрешения на запись и пользователи, добавленные в группу haait. Все остальные имеют доступ только для чтения.

Обратите внимание, что пользователь интерпретатора PHP должен иметь как минимум права на чтение для всех папок над папкой проекта Laravel. Вы можете быстро просмотреть разрешения для иерархии папок, используя команду namei с опцией -l . Например, если проект расположен в /var/www/html:

namei -l /var/www/html/storage/

Теперь рассмотрим, как исправить ошибку.

1. Исправление разрешений после установки (правильный способ)

Если вы знаете, какого пользователя использует интерпретатор PHP, обрабатывающий скрипты вашего проекта, лучше сменить владельца каталога хранилища на этого пользователя. Как я уже говорил, обычно это www-data :

sudo chown -R www-data:www-data storage

Здесь первые www-данные — это имя пользователя, вторые — имя группы, а опция -R означает, что владелец будет изменен рекурсивно для всех файлов и всех подпапок. После этого ошибка исчезнет:

Приведенная выше команда поможет вам исправить ошибку с разрешениями на запись журнала после запуска ремесленных команд. Однако лучше настроить разрешения по умолчанию, чтобы разрешить всем пользователям запись новых файлов журналов в Laravel, чтобы избежать этой проблемы в будущем.

2. Исправление разрешений после установки (допустимый способ)

Если вы не знаете, какого пользователя использует интерпретатор PHP, и вам необходимо быстро устранить проблему, самый простой способ — разрешить всем пользователям читать и писать в эту папку. Команда будет выглядеть так:

sudo chmod -R ugo+rwx storage

Альтернативно вы можете использовать восьмеричный синтаксис разрешений:

sudo chmod -R 777 storage

Однако обратите внимание, что использовать это следует осторожно, поскольку все пользователи сервера смогут писать в папку хранилища. Это небезопасно.

3. Исправьте разрешения для журналов

Во-первых, если произойдет эта ошибка, вам следует удалить файл журнала или обновить его разрешения, как показано выше. Например, удалите:

sudo rm -Rf storage/logs/laravel.log

По умолчанию Laravel записывает журналы в один файл с именем Storage/logs/laravel.log . Чтобы сделать этот файл доступным для записи всем пользователям, добавьте следующую строку в файл config/logging.php в разделе каналы -> один :

конфигурация/logging.php

"permission" => 0777,

После этого все пользователи системы смогут вести запись в файл журнала. Это небезопасно, но помогает избежать этой ошибки:

Если вы используете другие каналы журналирования, в которых для журналирования используются файлы, вам также необходимо добавить для них этот параметр.

4. Запустите Artisan из www-данных.

Альтернативно, вы всегда можете запустить команды artisan и композитор тем же пользователем, что и интерпретатор PHP, используя команду sudo с опцией -u . Например www-данные :

sudo -u www-data php artisan unknown:command

Вот как будут выглядеть права доступа и владелец журнала, если вы запускаете artisan только пользователем www-data :

Таким образом, владелец будет установлен правильно автоматически, и не будет проблем ни при развертывании Laravel, ни при записи в журнал.

Подведение итогов

В этой короткой статье мы рассмотрели, как исправить ошибку отказа в разрешении в Laravel, которая возникает, когда платформа пытается записать логи или кеш в папку storage. Как видите, все довольно просто.