Установка или исправление разрешений файлов
Дата обновления перевода 2023-07-06
Установка или исправление разрешений файлов
Symfony генерирует определенные файлы в каталоге var/
вашего проекта при запуске
приложения. В окружении dev
, файлы bin/console
и public/index.php
используют umask()
, чтобы гарантировать, что в каталог
можно писать. Это означает, что вам не нужно конфигурировать разрешения при разработке
приложения на вашей локальной машине.
Однако, использование umask()
не считается безопасным в производстве. Поэтому
вам часто нужно четко конфигурировать какие-то разрешения на ваших серверах производства,
как объясняется в этой статье.
Разрешения, требуемые приложениями Symfony
Вот разрешения, требуемые для запуска приложений Symfony:
- Каталог
var/log/
должен существовать и быть доступным для записи как вашему веб-серверу, так и пользователю терминала; - Каталог
var/cache/
должен быть доступным для записи пользователю терминала (пользователю, выполняющему командыcache:warmup
илиcache:clear
); - Каталог
var/cache/
должен быть доступным для записи пользователю веб-сервера, если вы используете кэш, основанный на файловой системе.
Конфигурация разрешений для приложений Symfony
На системах Linux и macOS, если ваш пользователь веб-сервера отличается от вашего пользователя командной строки, вам нужно правильно сконфигурировать разрешения, чтобы избежать проблем. Существует несколько способов сделать это:
1. Используя ACL на системе, которая поддерживает setfacl
(Linux/BSD)
Использование разрешений Списков контроля доступа (ACL) - самый безопасный и рекомендуемый
метод, чтобы сделать каталог var/
доступным для записи. Вам может понадобиться установить
setfacl
и включить поддержку ACL на вашем разделе диска до использования этого метода.
Затем, используйте следующий скрипт, чтобы определить вашего пользователя веб-сервера и
предоставить необходимые разрешения:
1 2 3 4 5 6 7 8
$ 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)
# если следующие команды не работают, попробуйте добавить опцию `-n` к `setfacl`
# установить разрешения для будущих файлов и папок
$ 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
setfacl
недоступен в точках монтирования NFS. Однако, хранени кэша и
логов над NFS не одобряется из соображений производительности.
2. Используя одного пользователя для CLI и веб-сервера
Отредактируйте вашу конфигурацию веб-сервера (обычно httpd.conf
или apache2.conf
для Apache) и установите ее пользователя, чтобы он был таким же, как и ваш пользователь
CLI (например, для Apache, обновите директивы User
и Group
).
Caution
Если это решение используется на сервере производства, убедитесь в том, что этот пользователь имеет только ограниченные привелегии (не имеет доступа к приатным данным или серверам, выполнению небезопасных бинарностей и т.д.), так как скомпроментированный сервер предоставит хакеру такие привелегии.
3. Не используя ACL
Если ни один из предыдущих методов не работает для вас, измените umask
, чтобы каталоги
кэша и логов были доступны для записи группе или миру (в зависимости от того, находятся ли
пользователи веб-сервера и командной строки в одной группе). Чтобы достичь этого, разместите
следующую строку в начале bin/console
и файлов public/index.php
:
1 2 3 4 5
umask(0002); // Это позволит разрешениям быть 0775
// or
umask(0000); // Это позволит разрешениям быть 0777
Caution
Изменение umask
не является потокобезопасным, поэтому рекомендуется
использовать методы ACL, когда они доступны.