Права решают простую вещь: может ли PHP-процесс создать файл в каталоге. Карточка сохраняется, а фото нет — почти всегда permission denied на upload. Кэш не пишется — админка тормозит или сыпется предупреждениями. Это не «баг загрузчика картинок», пока не проверили chmod и владельца.
На Windows в MicroServer права POSIX почти не мешают. Боль больнее на Linux shared и VDS.
Базовая схема
- Каталоги —
755(drwxr-xr-x). - Файлы —
644(-rw-r--r--). - Конфиг с паролем БД — не шире, чем нужно;
600или640, если владельцы правильные.
777 на весь сайт «чтобы заработало» — плохая привычка. На shared иногда прокатывает годами, пока вирус не допишет shell в upload. Лучше выровнять владельца.
Что должно быть writable
Зависит от комплекта, но обычно:
- каталоги загрузок:
upload/,uploads/,files/,images/; - кэш и временные:
cache/,tmp/,temp/; - иногда — каталог сессий или runtime, если скрипт пишет их внутрь проекта.
PHP-файлы движка writable быть не обязаны. Веб-серверу достаточно читать.
Владелец важнее цифры
На VDS с PHP-FPM пул крутится от www-data, nginx или отдельного пользователя сайта. Архив залили под root — цифры 755 не помогут, если каталог принадлежит root и group не пишет.
chown -R www-data:www-data /var/www/site
find /var/www/site -type d -exec chmod 755 {} \;
find /var/www/site -type f -exec chmod 644 {} \;
Имя пользователя подставьте своё (смотрите пул в /etc/php/*/fpm/pool.d/). На ISPmanager часто пользователь совпадает с системным юзером сайта.
На shared файловый менеджер создаёт файлы от вашего логина, PHP иногда от того же — тогда 755 хватает. Если PHP от другого uid — панель даёт «изменить владельца» или советует 775 на upload.
Типичные ошибки в логах
failed to open stream: Permission denied — нет права на запись в каталог или на сам файл.
Unable to create directory — родительский каталог не writable, или open_basedir режет путь.
Move uploaded file failed — временный upload PHP прошёл, а в целевой каталог перенос нет.
Смотрите точный путь в сообщении. Чините его, а не «весь www».
SELinux и open_basedir
На некоторых VDS кроме chmod есть SELinux. Симптомы похожи на permission denied при «правильных» 755. Это уже chcon/контекст httpd_sys_rw_content_t — отдельная история. На shared чаще режет open_basedir: скрипт не имеет права писать вне разрешённых путей. Тогда перенос upload «на уровень выше» ломается не из-за chmod.
Безопасность upload
Каталог загрузок должен принимать файлы, но не обязан исполнять PHP. Идеально — запрет выполнения скриптов в upload через конфиг Nginx/Apache или .htaccess. Иначе один загруженный .php вместо картинки станет бэкдором.
Не храните конфиг с паролями внутри writable-каталога без нужды.
Windows и локалка
В MicroServer NTFS-права обычно не мешают записи в папку проекта. Если «не пишет» локально — смотрите путь в конфиге, антивирус и то, что диск не read-only. См. локальный сервер.
Связка с установкой
Права выставляют после распаковки и до/после установщика — как скажет readme. Общий порядок: установка. Если 500 из-за невозможности писать сессии/кэш — ошибка 500. Перенос с сохранением загрузок: перенос скрипта.
На Nginx не забудьте client_max_body_size, иначе большая картинка умрёт до проверки прав: Nginx + PHP-FPM.
Как понять владельца PHP
На VDS создайте phpinfo или выполните:
ps aux | grep php-fpm
В пуле смотрите user/group. На shared в панели часто написано «сайт работает от пользователя X». Архив, залитый панельным файловым менеджером, обычно уже под тем же X. Архив через root-SSH — нет.
775 vs 755
Если веб-пользователь состоит в группе владельца каталога, иногда хватает 775 на upload и group write. Если пользователи разные и группы не дружат — либо общий пользователь, либо ACL, либо (хуже) 777. На нормальном VDS стремитесь к одному uid пула и файлов.
Файлы внутри upload после загрузки часто создаются с 644 — это нормально. Каталог должен позволять создавать новые файлы.
Диагностика одной командой
От пользователя PHP (su/sudo -u www-data) попробуйте:
touch /var/www/site/upload/test_write.txt
Получилось — права ок, ищите ошибку в коде/пути. Не получилось — читайте сообщение permission denied и чините владельца. Не начинайте с chmod -R 777 /.
Кэш и сессии
Кроме upload смотрите каталоги cache и session. Симптомы: медленная админка, постоянные разлогины, Warning в логе. Путь session.save_path вне проекта тоже должен быть writable — иногда это /var/lib/php/sessions с кривыми правами после апдейта пакета.
После восстановления из бэкапа
tar от root развернёт root:root. Сайт «как будто восстановили», но загрузки мертвы. Сразу chown под пул. Чеклист бэкапа: бэкап, перенос: перенос.
На shared после restore из панели хостера права обычно выставляются сами — но не всегда на кастомные пути вне www.
Чеклист
- Кто пользователь PHP-FPM/Apache.
- Кто владелец каталога upload.
- 755/644 база, writable только там, где нужно.
- Нет исполнения PHP в upload.
- Конфиг не 777.
- Тест touch и загрузка картинки из админки.
Если после правки прав всё ещё 500 — смотрите лог: там может быть уже не permission denied, а база/синтаксис: ошибка 500, MySQL. Требования окружения: требования.
Ещё один частый кейс на shared: файловый менеджер показывает «права 755», а PHP работает в режиме, где владелец файла — другой uid из пула облака. Тогда помогает кнопка «исправить владельца» в панели Beget/Timeweb/ISPmanager или обращение в поддержку хостера с просьбой выровнять UID сайта. Самим chmod 777 вы маскируете симптом и оставляете upload исполняемым для всех — плохой обмен. После выравнивания владельца вернитесь к 755/644 и повторите загрузку одного файла из админки. Установка с нуля, если каталоги upload в комплекте надо создать вручную: установка.
Частые вопросы
Права chmod на папки php скрипта?
После установки скрипта чаще всего ломается запись в upload и cache — из-за прав.
Сколько времени занимает «Права chmod на папки PHP-скрипта»?
Ориентир по тексту мануала — около 5 мин. На практике зависит от хостинга и подготовки базы.
Нужен ли отдельный сервер?
Для большинства скриптов достаточно хостинга или VDS с PHP и MySQL. Подбор сервера — в разделе VDS и требованиях к PHP/MySQL.
Установка готового скрипта php mysql?
Разбор рядом в мануале по этому запросу. установка готового скрипта php mysql
Требования php mysql для скрипта?
Разбор рядом в мануале по этому запросу. требования php mysql для скрипта