Fork me on GitHub

The WebDevil

Enjoy development

В качестве вэб-сервера я использую lighttpd. И сегодня я наткнулся на старую проблему – вэб-сервер работает из-под пользователя www-data, и когда пользователь pupkin загружает какой-то файл – этот файл принадлежит не pupkin’у, а www-data. И через ftp удалить его он не может, и вынужден искать некие web-file-manager’ы.

Так вот я погуглил и наткнулся на execwrap. Он очень мелкий, почти ничего ему не нужно стороннего для работы, конфигурировать и использовать его крайне просто (да-да, я знаю про suExec, но он мне не сильно понравился).

В результате конфиг для сайта у меня выглядит так:

$HTTP["host"] == "pupkin.com" {
    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” следующего содержания:

#!/bin/bash

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/

Comments are closed.