В качестве вэб-сервера я использую lighttpd. И сегодня я наткнулся на старую проблему – вэб-сервер работает из-под пользователя www-data, и когда пользователь pupkin загружает какой-то файл – этот файл принадлежит не pupkin’у, а www-data. И через ftp удалить его он не может, и вынужден искать некие web-file-manager’ы.
Так вот я погуглил и наткнулся на execwrap. Он очень мелкий, почти ничего ему не нужно стороннего для работы, конфигурировать и использовать его крайне просто (да-да, я знаю про suExec, но он мне не сильно понравился).
В результате конфиг для сайта у меня выглядит так:
server.name = "pupkin.com"
site-root = "/home/pupkin/www/" + server.name
server.document-root = site-root + "/www"
accesslog.filename = site-root + "/log/access.log"
setenv.add-environment = ( "AWSTATS_FORCE_CONFIG" => server.name )
auth.backend.htpasswd.userfile = site-root + "/awstats.passwd"
fastcgi.server = ( ".php" => ((
"bin-path" => "/var/www/lighttpd/execwrap",
"socket" => "/tmp/" + server.name + ".phpsocket",
"max-procs" => 10,
"bin-environment" => (
"UID" => "9999",
"GID" => "9999",
"TARGET" => site-root + "/cgi-bin/php",
"CHECK_GID" => "1",
"CGI_BIN_DIR" => site-root + "/cgi-bin/",
"PHP_FCGI_CHILDREN" => "2",
"PHP_FCGI_MAX_REQUESTS" => "5000"
)
)))
}
где 9999 – ID пользователя и группы (у меня они часто совпадают).
А в директории /home/pupkin/www/pupkin.com/cgi-bin лежит два файла – симлинк на php.ini и исполняемый файлик “php” следующего содержания:
cd $CGI_BIN_DIR
exec /usr/bin/php-cgi -c ./php.ini
Как видите, если надо то конфиг php.ini можно пользователю задать персональный. А файлик php обязательно должен принадлежать этому же пользователю.
Когда все сделано – рестартуем lighttpd и смотрим, нет ли в логах ругательств с кодом ошибки 22 – это, как видно из сорса execwrap, несоответствие прав.
Enjoy =)
UPD: execwrap умер и воскрес тут: http://cgit.stbuehler.de/gitosis/execwrap/