PHP на сервере Linux, PHP-FPM (версия уточняется)

PHP на сервере: PHP не может записать файл в каталог приложения

  • Обновлено
  • Чтение ≈ 3 минуты

Краткий ответ

При попытке записать файл PHP может получить Permission denied или No such file or directory. Причина бывает в владельце папки, правах всех родительских каталогов, неверном относительном пути, запрещённой области open_basedir, SELinux/AppArmor, переполнении диска или read-only mount.

В этой статье
  1. Что происходит и когда применима инструкция
  2. Причины и диагностические признаки
  3. Подробная пошаговая инструкция
  4. Как проверить, что проблема исправлена
  5. Если не помогло — дальнейшая диагностика и откат

#Что происходит и когда применима инструкция

При попытке записать файл PHP может получить Permission denied или No such file or directory. Причина бывает в владельце папки, правах всех родительских каталогов, неверном относительном пути, запрещённой области open_basedir, SELinux/AppArmor, переполнении диска или read-only mount.

#Причины и диагностические признаки

Возможная причинаКак узнатьЧто делать
Пользователь FPM не имеет права на записьПользователь FPM не имеет права на запись. Журнал показывает Permission denied, путь существует.Журнал показывает Permission denied, путь существует.Проверить UID процесса, владельца и ACL каталога.
Путь не существует либо неверенПуть не существует либо неверен. No such file or directory, относительный путь зависит от рабочего каталога.No such file or directory, относительный путь зависит от рабочего каталога.Создать разрешённую папку штатным способом и использовать абсолютный путь.
Ограничение системы или приложенияОграничение системы или приложения. Права Unix допустимы, но open_basedir, MAC или read-only ФС блокируют запись.Права Unix допустимы, но open_basedir, MAC или read-only ФС блокируют запись.Проверить конкретное ограничение без общего отключения защиты.

#Подробная пошаговая инструкция

  1. Найдите точный путь и характер ошибкиВ журнале PHP прочитайте имя файла и errno/предупреждение; убедитесь, что запись выполняется из того же запроса и окружения. Не копируйте путь с секретными именами клиентов в публичный отчёт. Отдельно проверьте наличие свободного места на нужном разделе.
  2. SSH, только чтение, замените пример каталога проекта
    Linux · Терминал (Bash)Команда
    SSH, только чтение, замените пример каталога проекта. df -h проверяет свободные байты, df -i — inode; обе причины могут остановить запись.
    df -h /var/www/example; df -i /var/www/example
  1. Уточните пользователя, под которым работает PHPСверьте user/group в реальном pool.d с владельцем каталога. Не принимайте пользователя вашего SSH-сеанса за пользователя веб-процесса. При Apache mod_php или контейнере место настройки другое.
  2. SSH, только чтение
    Linux · Терминал (Bash)Команда
    SSH, только чтение. Найдите дочерние процессы pool имя, а не только основной процесс master.
    ps -eo user,group,pid,args | grep -E "[p]hp-fpm|[p]hp.*fpm"
  1. Проверьте права на всю цепочку каталоговИспользуйте namei -l и getfacl при наличии. Пользователю нужен проход (x) по родительским папкам и запись в целевую. Если файл уже существует, нужны права на сам файл; создание нового файла зависит от прав папки. Не назначайте chmod -R 777.
    Linux · Терминал (Bash)Команда
    SSH, только чтение прав. Путь замените реальным. namei показывает родительские каталоги, включая пропущенные при простой проверке ls.
    namei -l /var/www/example/storage/cache/data.json; ls -ld /var/www/example/storage/cache
  1. Проверьте ограничения вне стандартных правПосмотрите open_basedir в настройках веб-FPM, наличие SELinux/AppArmor в журнале отказов, монтирование только для чтения и возможные квоты пользователя. Если есть deny, исправляйте разрешённую политику для нужной папки вместо глобального отключения механизма безопасности.
  1. Сделайте минимальное разрешение именно на каталог данныхСохраните настройки и, если необходимо, назначьте подходящую группу или ACL на конкретную папку storage/uploads. Код приложения не должен быть доступен для записи без причины; файлы конфигурации с паролями оставьте недоступными веб-пользователю на запись. При панели хостинга используйте её механизм владельца сайта.
  1. Проверьте запись безопасным пробным действиемЧерез штатный интерфейс приложения создайте тестовый документ/кэш, затем удалите его. Если тестируете через CLI, запустите от пользователя FPM в контролируемом каталоге и не допускайте создания файлов под root, которые затем заблокируют веб-процесс.
  1. Проверьте права после успешного тестаОткройте созданный файл на сервере: владельцем должен быть ожидаемый пользователь или группа, а разрешения — минимальные. Если ошибка повторяется после перезапуска/развёртывания, проверьте, не пересоздаёт ли система каталог с другим владельцем.

#Как проверить, что проблема исправлена

Штатная операция записи выполняется без Permission denied, нет новых ошибок, каталог исходного кода не получил лишние права.

#Если не помогло — дальнейшая диагностика и откат

Если доступ разрешён, но ошибка остаётся, смотрите реальный путь из сообщения PHP, open_basedir и ограничения контейнера. Не меняйте владельца всей /var/www рекурсивно.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.