Читайте дальше:
http://www.alexeykopytko.com/2010/nginx-gpasswd-www-data.html Предположим, у нас есть сервер на котором хостится несколько сайтов. При этом код каждого сайта выполняется от своего пользователя и к коду и данным других сайтов доступа не имеет. Мы имеем типичный образец виртуального хостинга.
Мы хотим чтобы статические файлы раздавал nginx прозрачно для всех пользователей при минимуме усилий и времени на поддержку со стороны администратора. Но возникает проблема: как дать nginx доступ к чтению файлов пользователей, и при этом не дать пользователям читать файлы соседа?
Да, мы можем дать право на чтение файлов для группы, с которой выполняется nginx. Но тогда каждому из пользователей придётся вручную править права статических файлов при загрузке. Очевидно, нам это неподходит.
Эта проблема легко решается с помощью ACL.
В нашем случае nginx выполняется с правами пользователя www-data:
- Перво наперво нужно убедиться что целевая файловая система поддерживает установку ACL, и перемонтировать её, если нужно, с опцией acl:
# mount -o remount,acl /home
- Так как nginx должен получить необходимый минимум прав, то есть права только на чтение и вход в поддиректории, дадим ему право заходить в домашнюю директорию пользователя example:
# setfacl -m user:www-data:--x /home/example /home/example/www
Файлы внутри указанных директорий, доступ к которым явно не разрешен, nginx читать не сможет:
/home/example$ ls www
ls: cannot open directory www: Permission denied
- Теперь дадим nginx право читать те самые статические файлы:
# setfacl -R -m d:u:www-data:rX /home/example/www/htdocs
Эти права будут рекурсивно (-R) распространены на все лежащее ниже в дереве файлов и на все новые файлы. То есть, вся эта схема будет работать прозрачно для пользователя. Чего мы и добивались.
- Дальше настраиваете nginx как вы это обычно делаете для раздачи статических файлов. Например, так:
location ~* \.(jpg|gif|png|css|js|swf)$ {
expires 7d;
root /home/example/www/htdocs;
}
Вся соль приведённой схемы заключается в двух командах:
# setfacl -m user:www-data:--x /home/example /home/example/www
# setfacl -R -m d:u:www-data:rX /home/example/www/htdocs