Для разработки и тестирования веб-проектов я уже больше года использую виртуальный сервер под управлением Ubuntu Server 10.04 LTS, работающий в VirtualBox. Такой вариант гораздо более «аутентичный», чем использование Apache под Windows, дает некоторый опыт работы в родном для используемых программных продуктов окружении, и минимизирует количество неприятных сюрпризов при переносе готового проекта на реальный хостинг.
Всё бы хорошо, но есть одна весьма неприятная проблема: поскольку штатные юниксовые средства распределения прав доступа подразумевают указание прав только для пользователя, группы и всех остальных, по-умолчанию пользователю www-data, под которым работает веб-сервер Apache, недоступны файлы, созданные моим текущим пользователем. А текущему пользователю без sudo недоступны файлы, владельцем которых является www-data.
Есть несколько неправильных способов решения проблемы (предоставить полный доступ к файлам для всех, или изменить владельца файлов на webmaster:www-data), но, даже если отбросить вопрос безопасности таких решений, это только полумера, т.к. при создании в директории вашего сайта новых файлов, они будут недоступны веб-серверу, пока вы не предоставите доступ к ним вручную. Отстой.
Правильный способ — настройка прав доступа к файлам с использовании списка контроля доступа (Access Control List, ACL).
Для того, чтобы начать использовать ACL, нужно установить соответствующий пакет. Выполняем команду:
sudo apt-get install acl
Теперь нужно включить поддержку acl для файловой системы, на которой мы будем его использовать. Делаем для соотвествующего раздела в /etc/fstab что-то вроде этого (рекомендую на всякий случай сделать резервную копию оригинального файла):
UUID=628d041e-3d90-428a-8be6-4a9a9e940cc9 /home ext4 defaults,acl 0 2
Перемонтируем файловые системы:
sudo mount /home -o remount
Всё, теперь мы можем настраивать права доступа к файлам и директориям для произвольного количества пользователей. Для установки прав доступа посредством ACL используется команда setfacl, для чтения прав доступа: getfacl. Выглядит это приблизительно следующим образом.
sudo setfacl -R -d -m u:www-data:r-x,g:www-data:r-x ~/htdocs
— мы предоставили пользователю www-data и группе www-data права на чтение и выполнение всего, что находится в директории ~/htdocs и вложенных (ключ -R) директориях. Установленные права будут автоматически наследоваться (ключ -d) для директорий и папок, которые будут создавться внутри ~/htdocs. При этом владельцем всего этого добра является наш текущий пользователь.
По-умолчанию веб-серверу запрещена запись в директории веб-сайтов (в большинстве случаев это и не нужно). Чтобы разрешить изменение каких то папок или файлов:
setfacl [-R] [-d] -m u:www-data:rwx,g:www-data:rwx [file|directory]
Всем удобного программирования! :)