Git с умным HTTP и suexec: хранилище не найдено

Я пытаюсь установить свой собственный репозиторий Git на одном из моих серверов с интеллектуальным HTTP.

Он работает на виртуальном сервере без suexec, но не на моем рабочем сервере, на котором включен suexec. Когда я пытаюсь клонировать или выдвинуть, это говорит:

Неустранимый: хранилище ' http://domain.tld/git/project/ ' не найдено

Конфигурация Apache выглядит так:

<VirtualHost *:80>
    Options -Indexes +ExecCGI

    ServerAdmin user@domain.tld

    DocumentRoot /var/www/domain.tld

    ServerName domain.tld

    Alias /fcgi-bin/ /var/www/domain.tld/fcgi-bin/
    SuexecUserGroup domainuser domainuser

    ########## GIT ##########

    SetEnv GIT_PROJECT_ROOT /var/www/git/git_domain
    SetEnv GIT_HTTP_EXPORT_ALL
    SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
    ScriptAlias /git/ /var/www/git/git_domain/git-http-backend/

    Alias /git /var/www/git/git_domain
    <Directory /usr/lib/git-core>
        Options +ExecCGI +SymLinksIfOwnerMatch
        AllowOverride All
        Require all granted
    </Directory>

    <Directory /var/www/git/git_domain>
        Options -Indexes -SymLinksIfOwnerMatch
        AllowOverride All
        Require all granted
    </Directory>

    ########## PROJECT DIRS HTPASS ##########

        <LocationMatch "^/git/project1/.*$">
#            DAV on
            AuthType Basic
            AuthName "project1"
            AuthUserFile /var/www/git/gitpass/domain/project1
            Require valid-user
        </LocationMatch>

    ########## /PROJECT DIRS HTPASS ##########
    ########## /GIT ##########

Если я отключу

ScriptAlias ​​/ git / / var / www / git / git_domain / git-http-backend /

Я могу клонировать, но нажать, потому что в этом случае это работает с DAV.

Я думаю, что изменил владельцев и разрешения всех файлов на правильное значение (domainuser, 755), и suexec не жалуется ни на что в своем журнале.

Может кто-нибудь сказать мне, где я сделал что-то не так?

Заранее спасибо.

1 ответ

Решение

Это легко: mod_suexec стирает все переменные окружения перед запуском целевой программы и поэтому все ваши SetEnv директивы не имеют никакого эффекта.

К сожалению, последний раз я проверял (столкнулся с той же проблемой) mod_suexec не было ручки настройки "белого списка" для переменных среды, поэтому правильный подход такой:

  1. Создайте скрипт, который обернет ваш фактический git-http-backend,

    Похоже, у вас уже есть.

  2. Переформулируйте все соответствующие SetEnv директивы там, используя оболочку export встроенный.

    То есть,

    SetEnv GIT_PROJECT_ROOT /var/www/git/git_domain
    

    becames

    export GIT_PROJECT_ROOT=/var/www/git/git_domain
    

    в коде скрипта.

Если вам нужен один и тот же конфигурационный файл virtualhost для работы как в "обычном" режиме, так и под mod_suexec поместите подробный комментарий об этой причуде рядом с блоком вашего SetEnv директивы, предлагающие следующему парню синхронизировать их с тем, что помещено в скрипт-обертку.

Подробнее о mod_suexec поведение можно найти здесь.

Другие вопросы по тегам