Назад | Перейти на главную страницу

Проблема с SVN + Apache / SSL / SSPI и большими коммитами / импортом

Я использую SVN 1.6.3 поверх Apache 2.2 в Windows, используя самые последние сборки CollabNet Windows. Я использую mod_auth_sspi и mod_ssl для защиты своих соединений и выполнения авторизации. При небольших проверках и импорте ни у одного из моих пользователей нет проблем с выполнением своей работы. Но при импорте или регистрации большое количество файлов, пользователям будет предложено ввести свои учетные данные (которые сервер сразу же отклонит), а затем появится сообщение об ошибке:

PUT of <path and filename> 
authorization failed: Could not authenticate to server: rejected Basic
challenge (https://<my server name>)

Мы пробовали использовать как клиент командной строки, так и TortoiseSVN.

Эта ошибка, похоже, связана с количеством зарегистрированных файлов, а НЕ с совокупным размером зафиксированного содержимого. Например, если я попытаюсь проверить 90 однобайтовых файлов .txt, импорт не удастся, как описано. Это не всегда 90 файлов - я думаю, это как-то связано с совокупным размером имен файлов. У меня неприятное ощущение, что SVN пытается втиснуть все имена файлов в один заголовок HTTP-запроса или что-то в этом роде, а Apache каким-то образом это отклоняет.

Не то чтобы я мог исследовать, что происходит на уровне HTTP с помощью Wireshark, поскольку все зашифровано через HTTPS. Вот мой файл конфигурации, без комментариев. Кто-нибудь сталкивался с этим раньше? Какие-либо предложения?

ThreadsPerChild 250
MaxRequestsPerChild  0

ServerRoot "C:\Program Files\CollabNet Subversion Server/httpd"

Listen 443

LoadModule actions_module modules/mod_actions.so
LoadModule alias_module modules/mod_alias.so
LoadModule asis_module modules/mod_asis.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authn_default_module modules/mod_authn_default.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authz_default_module modules/mod_authz_default.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule cgi_module modules/mod_cgi.so
LoadModule dir_module modules/mod_dir.so
LoadModule env_module modules/mod_env.so
LoadModule imagemap_module modules/mod_imagemap.so
LoadModule include_module modules/mod_include.so
LoadModule isapi_module modules/mod_isapi.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module modules/mod_mime.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule userdir_module modules/mod_userdir.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule dav_module         modules/mod_dav.so
LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule sspi_auth_module   modules/mod_auth_sspi.so
LoadModule authz_svn_module   modules/mod_authz_svn.so

ServerAdmin localhost@localdomain

ServerName sourcecontrol.mydomain.com

DocumentRoot "C:\Program Files\CollabNet Subversion Server/httpd/htdocs"

<Directory />
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Allow from all
    Satisfy all
</Directory>

<Directory "C:\Program Files\CollabNet Subversion Server/httpd/htdocs">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

<FilesMatch "^\.ht">
    Order allow,deny
    Deny from all
</FilesMatch>

ErrorLog logs/error.log
LogLevel warn

<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>

    CustomLog logs/access.log common
</IfModule>

<IfModule alias_module>  
    ScriptAlias /cgi-bin/ "C:\Program Files\CollabNet Subversion Server/httpd/cgi-bin/"
</IfModule>
<Directory "C:\Program Files\CollabNet Subversion Server/httpd/cgi-bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>

DefaultType text/plain

<IfModule mime_module>
    TypesConfig conf/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
</IfModule>

<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>

<Location /svn>
   DAV svn
   SVNParentPath D:\repository
   AuthName "Subversion repository"
   AuthType SSPI
   SSPIAuth On
   SSPIAuthoritative On
   SSPIDomain NA
   SSPIOfferBasic On
   Require valid-user   

   SVNAutoVersioning on
   ModMimeUsePathInfo on
   AuthzSVNAccessFile "d:/repository/access-file.txt"
</Location>

<VirtualHost *:443 >
    DocumentRoot d:\repository
    SSLEngine On
    SSLCertificateFile conf/ssl.crt/server.crt
    SSLCertificateKeyFile conf/ssl.crt/server.key
</VirtualHost>

Оказывается, мне нужно было добавить эту строку в httpd.conf (я добавил ее вверху, чтобы она применялась ко всем каталогам)

MaxKeepAliveRequests 0

и, для удобства, я добавил

KeepAlive On 

на всякий случай они решат поумничать со мной в следующей версии httpd и по умолчанию выключить.