Установка или исправление разрешений файлов

Установка или исправление разрешений файлов

Одним важным требованием Symfony является то, что каталог var должен быть перезаписываемый как веб-сервером, так и ползователем командной строки.

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

1. Использование одного пользователя для командной строки и веб-сервера

Редактируйте конфигурацию вашего веб-сервера (обычно httpd.conf или apache2.conf для Apache) и установите её ползователя так, чтобы он совпадал с вашим пользователем командной строки (например, для Apache, обновите директивы User и Group).

Caution

Если это решение используется на сервере производства, убедитесь в том, что этот пользователь имеет только лимитированные привелегии (и не имеет доступа к приватным данным или серверам, выполнению небезопасных бинарных кодов и др.), так как скомпроментированные сервер предоставит хакеру такие привелегии.

2. Использование ACL в системе, поддерживающей chmod +a (macOS)

В системах macOS, команда chmod``поддерживает флаг ``+a для определения ACL. Используйте следующий скрипт, чтобы определить пользователя вашего веб-сервера и предоставить ему необходимые разрешения:

1
2
3
4
5
6
$ 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

3. Использование ACL в системе, поддерживающей setfacl (Linux/BSD)

Большинство дистрибутивов Linux и BSD не поддерживают chmod +a, однако поддерживают другую утилиту под названием setfacl. Вам может понадобиться установить setfacl и включить поддержку ACL в вашем разделе диска до того, как его использовать. Потом, используйте следующий скрипт, чтобы определить пользователя вашего веб-сервера и предоставить ему необходимые разрешения:

1
2
3
4
$ 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

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

setfacl недоступна в монтаже NFS. Однако, хранение кеша и записей логов в NFS очень порицается по причинам производительности.

4. Без использования ACL

Если ни один из предыдущих методов для вас не работает, измените umask так, чтобы каталоги кеша и логов имели возможность быть перезаписанными группами или миром (в зависимости от того, находятся ли пользователь веб-сервера и пользователь командной строки в одной группе, или нет). Чтобы достичь эого, пометите следующую строку в начале файлов bin/console, web/app.php и web/app_dev.php:

1
2
3
4
5
umask(0002); // This will let the permissions be 0775

// or

umask(0000); // This will let the permissions be 0777

Note

Изменение umask не ориентировано на многопоточное изменение, поэтому рекомендуются ACL-методы в случае, если они доступны.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.