Наверное верная и коротко написано здесь, а ниже я сохранил мои размышления из прошлого.
Когда вы используете веб-сервер (например Apache или Nginx), то этот сервер работает от пользователя www-data, но команды в консоли вы обычно выполняете от другого пользователя (например vasya), вот тут и возникает проблема. Заключается проблема в том, что пользователь www-data создает файлы, которые пользователь vasya не может изменить/удалить. На этот счет есть ряд ниже изложенных решений. И сразу опишу решение:
sudo adduser $(whoami) www-data && newgrp www-data
echo "umask=0002" >> /usr/local/etc/php-fpm.conf
А теперь ниже опишу, почему такое решение правильное.
Правильное решение:
Неправильные решения:
Все бы хорошо, но иногда этого недостаточно, потому что веб-сервер может создавать файлы/директории без прав на запись для группы www-data и такое положение можно исправить одним из следующих решений.
В Linux можно для создаваемых директорий/файлов задавать права доступа по умолчанию, например хорошей практикой будет задать права в файле /etc/profile, просто добавив строку:
umask 002
Отлично, теперь файл созданный пользователем А, может быть изменен пользователями, которые находятся в той же группе, что и пользователь А.
К сожалению, файлы созданные другими процессами, такими как веб-сервер, по-прежнему будут использовать значение по умолчанию (если не настроено иное). Например чтобы apache использовал другую umask, мы можем определить это внутри /etc/apache2/envvars (системы debian и ubuntu) или /etc/sysconfig/httpd (системы rhel,centos) подобным образом:
umask 002
и перезагрузите apache, чтобы включить его.
Заметка 1: для php-fpm простой способ: echo "umask=0002" >> /usr/local/etc/php-fpm.conf
Заметка 2: обычно в современных дистрибутивах Linux это значение по умолчанию равно 022, вы можете проверь это выполнив команду:
umask
Измените umask так, чтобы каталоги/файлы которые создает PHP, были доступны независимо от того, создает их пользователь веб-сервера и пользователь командной строки. Добавьте в начале bin/console или web/app.php:
umask(0002); // This will let the permissions be 0775
// or
umask(0000); // This will let the permissions be 0777
ПРИМЕЧАНИЕ: изменение umask не является потокобезопасным.
Проблемный вариант, подробности в конце статьи.
On macOS systems, the chmod command supports the +a flag to define an ACL. Use the following script to determine your web server user and grant the needed permissions:
rm -rf var/cache/*
rm -rf var/logs/*HTTPDUSER=$(ps axo user,comm | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\ -f1)
sudo chmod +a "$HTTPDUSER allow delete,write,append,file_inherit,directory_inherit" var
sudo chmod +a "$(whoami) allow delete,write,append,file_inherit,directory_inherit" var
Most Linux and BSD distributions don't support chmod +a, but do support another utility called setfacl. You may need to install setfacl and enable ACL support on your disk partition before using it. Then, use the following script to determine your web server user and grant the needed permissions:
HTTPDUSER=$(ps axo user,comm | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\ -f1)
# if this doesn't work, try adding '-n' option
sudo setfacl -dR -m u:"$HTTPDUSER":rwX -m u:$(whoami):rwX var
sudo setfacl -R -m u:"$HTTPDUSER":rwX -m u:$(whoami):rwX var
NOTE: The first setfacl command sets permissions for future files and folders, while the second one sets permissions on the existing files and folders. Both of these commands assign permissions for the system user and the Apache user.
setfacl isn't available on NFS mount points. However, storing cache and logs over NFS is strongly discouraged for performance reasons.
На практике права, выставленные описанным выше способом, постепенно начинают «слетать» сами собой. В частности, пропадают права на запись в папки. С этим я столкнулся при автоматическом деплойменте кода сайтов с гитлаба. Поначалу всё шло хорошо. Затем rsync, который я использовал для синхронизации извне, стал жаловаться на недоступность некоторых файлов на запись. Я долго не мог понять, в чём дело, но в один прекрасный день просто решил пройтись по папкам getfacl-ом и обнаружил, что дефолтные права пользователя отсутствуют, а ведь я ничего на сервере не менял:
user::rw-
group::r--
other::r--
Вероятно, это связано с тем, что rsync копирует директории без ключа -p (а ведь в мануале к acl сказано, что при копировании аргумент -p обязателен).
Источник: 1 - 2 - 3 - 4 - 5 - 6 - 7