Статика через nginx используя ACL

Mar 20, 2014 22:08

Читайте дальше: 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

useful, linux, nginx

Previous post Next post
Up