Previous Entry Share Next Entry
Статика через nginx используя ACL
Onsen
sanmai
Читайте дальше: http://www.alexeykopytko.com/2010/nginx-gpasswd-www-data.html

Предположим, у нас есть сервер на котором хостится несколько сайтов. При этом код каждого сайта выполняется от своего пользователя и к коду и данным других сайтов доступа не имеет. Мы имеем типичный образец виртуального хостинга.

Мы хотим чтобы статические файлы раздавал nginx прозрачно для всех пользователей при минимуме усилий и времени на поддержку со стороны администратора. Но возникает проблема: как дать nginx доступ к чтению файлов пользователей, и при этом не дать пользователям читать файлы соседа?

Да, мы можем дать право на чтение файлов для группы, с которой выполняется nginx. Но тогда каждому из пользователей придётся вручную править права статических файлов при загрузке. Очевидно, нам это неподходит.

Эта проблема легко решается с помощью ACL.

В нашем случае nginx выполняется с правами пользователя www-data:

  1. Перво наперво нужно убедиться что целевая файловая система поддерживает установку ACL, и перемонтировать её, если нужно, с опцией acl:
    # mount -o remount,acl /home


  2. Так как 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


  3. Теперь дадим nginx право читать те самые статические файлы:
    # setfacl -R -m d:u:www-data:rX /home/example/www/htdocs

    Эти права будут рекурсивно (-R) распространены на все лежащее ниже в дереве файлов и на все новые файлы. То есть, вся эта схема будет работать прозрачно для пользователя. Чего мы и добивались.

  4. Дальше настраиваете 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

?

Log in

No account? Create an account