将 git 存储库迁移到新服务器

将 git 存储库迁移到新服务器

我想从 RedHat 6.9 (Santiago) 迁移我的存储库,其中包含 apache 2.2 和 php 5.3

至:Ubuntu 16.04.4 LTS,带有 apache 2.4 和 php 7.0

我使用“gitweb/git-http-backend”通过 https 为存储库提供服务,因此,我在这里不使用 SSH。另一件重要的事情是,我不会更改 VirtualHost 服务器名称,因此用户甚至不会注意到这一点。

不幸的是,我的新服务器上的初步测试不起作用,当尝试克隆现有存储库时,我会收到 404 未找到错误。

我的第一个问题是:对于测试,原始服务器的名称是:my_server.com,那么对于新服务器,我使用 my_server_dev.com。这仅用于测试。之后,我将用旧服务器的名称替换新服务器的名称。我是否必须在测试设置的存储库中更改服务器名称才能查看 git 是否有效?我猜一旦测试成功,就不必在存储库上更改任何内容,对吗?

这在我的旧服务器上有效:

<VirtualHost *:443>
  ServerName my_server.com
  AddType application/x-httpd-php .php
  CustomLog "/var/log/httpd/my_server_access.log" common
  RewriteEngine On

  SSLEngine on
  SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
  SSLCertificateFile "/etc/ssl/certs/my_cert.crt"
  SSLCertificateChainFile "/etc/ssl/certs/my_fullchain.crt"
  SSLCertificateKeyFile "/etc/ssl/certs/my_key.priv.key"

  DocumentRoot /var/www/
  <Directory />
    Options FollowSymLinks
    AllowOverride None
  </Directory>

  <Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
  </Directory>

  SetEnv GIT_PROJECT_ROOT /home/git
  SetEnv GIT_HTTP_EXPORT_ALL
  ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/
  Alias /git /home/git

  <Location /git>
    AuthType Basic
    AuthName "Git repositories"
    AuthBasicProvider ldap
    AuthzLDAPAuthoritative on

    AuthLDAPURL "ldaps://my_server1.com my_server2.com my_server3.com/ou=users,ou=my_ou,o=my_domain,c=my_country?uid?sub?(objectClass=*)"
    AuthLDAPBindDN "my_bind_dn"
    AuthLDAPBindPassword my_password
    AuthLDAPGroupAttributeIsDN off
    AuthLDAPGroupAttribute memberUid
    require valid-user

    AuthGroupFile /etc/httpd/my_group_file
  </Location>
  <Location /git/my_repo1.git>
        Allow from all
        Order allow,deny
        require group group1 group2
  </Location>
  <Location /git/my_repo2.git>
        Allow from all
        Order allow,deny
        require group group1 group3
  </Location>
  #More repositories here
</VirtualHost>

所以现在,将“/home/git”下的所有内容从我的旧服务器复制到我的新服务器后,我得到了:

<VirtualHost *:443>
  ServerName my_server.com

  SSLEngine on
  SSLProtocol ALL -SSLv2 -SSLv3
  SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
  SSLHonorCipherOrder on
  SSLCompression off
  SSLOptions +StrictRequire
  SSLCertificateFile /etc/ssl/certs/my_cert.pem
  SSLCertificateChainFile /etc/ssl/certs/my_fullchain.pem
  SSLCertificateKeyFile /etc/ssl/certs/my_privkey.pem

  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/my_domain_access.log combined
  RewriteEngine On

  DocumentRoot ${APACHE_ROOT}/my_server
  <Directory ${APACHE_ROOT}/my_server>
    Options Indexes FollowSymLinks MultiViews
    Require all granted
    AllowOverride All
  </Directory>

  SetEnv GIT_PROJECT_ROOT /var/www/html/my_server/git
  SetEnv GIT_HTTP_EXPORT_ALL
  ScriptAlias /git/ /usr/lib/git-core/git-http-backend/
  Alias /git /var/www/html/my_server/git

  <Location /git>
    AuthType Basic
    AuthName "Git repositories"
    AuthBasicProvider ldap
    AuthLDAPBindAuthoritative on
    AuthLDAPURL "ldaps://my_server1.com my_server2.com my_server3.com/ou=users,ou=my_ou,o=my_domain,c=my_country?uid?sub?(objectClass=*)"
    AuthLDAPBindDN "my_bind_dn"
    AuthLDAPBindPassword my_password
    AuthLDAPGroupAttributeIsDN off
    AuthLDAPGroupAttribute memberUid
    require valid-user

    AuthGroupFile /etc/apache2/my_group_file
  </Location>
  <Location /git/my_repo1.git>
    require group group1 group2
  </Location>
  <Location /git/my_repo2.git>
    require group group1 group3
  </Location>
  #More repositories here
</VirtualHost>

如果你仔细观察,你会发现我唯一的改变是:

  1. 已删除:“AddType application/x-httpd-php .php”。Ubuntu 中已通过“/etc/mods-enabled -> php7.0.*”启用此功能
  2. apache 目录已更改为 Ubuntu 目录:/etc/apache2、/var/log/apache2 和 /var/www/html
  3. SSLCipherSuite 稍有改变,但这应该不是问题
  4. 此项已更改:

    命令允许、拒绝

    允许所有人

    经过:

    要求所有已授予

  5. “/home/git” 被“/var/www/html/my_domain/git” 更改。说实话,我也尝试了第一种方法,但不起作用。我见过“/var/www/html” 以外的其他文件夹不起作用的情况。

  6. “/usr/libexec/git-core/git-http-backend/” 被更改为:“/usr/lib/git-core/git-http-backend/”,这是该二进制文件在 Ubuntu 上所在的位置。
  7. “AuthzLDAPAuthoritative” 已更改为:“AuthLDAPBindAuthoritative”。第一个指令在 apache 2.4 上不再存在。
  8. 更改:

允许所有人

命令允许、拒绝

要求组 group1

通过只是:

要求组 group1

对于 Apache 2.4 来说这似乎已经足够了

我的其余配置基本相同。我现在知道 SSL 和 LDAP 身份验证都可以正常工作。如果我提供不允许访问存储库的用户的凭据,那么我将在错误日志文件中看到以下内容:

[authz_groupfile:error] [pid 17829] [client xxx.xxx.xxx.xxx:xxxx] AH01666: Authorization of user my_user1 to access /git/my_repo.git failed, reason: user doesn't appear in group file (/etc/apache2/my_group_file).
[authz_core:error] [pid 17829] [client xxx.xxx.xxx.xxx:xxxx] AH01631: user my_user1: authorization failure for "/git/my_repo.git":

尝试使用具有访问权限的用户,将通过身份验证,但我会在客户端上看到以下内容:

fatal: repository 'https://my_domain.com/git/my_repo.git/' not found

并且在访问日志中确实有一个404错误代码:

xxx.xxx.xxx.xxx - my_user [14/Mar/2018:20:45:29 +0100] "GET /git/my_repo.git/info/refs?service=git-upload-pack HTTP/1.1" 404 596 "-" "git/2.10.0.windows.1"

这可能是什么问题?

先谢谢了

谨致问候 Josef

答案1

好的,我搞明白了。事实证明,需要 mod_cgi 或 mod_cgid。这是 Ubuntu 二进制包附带的标准 /etc/apache2/conf-available/gitweb.conf:

<IfModule mod_alias.c>
    <IfModule mod_mime.c>
        <IfModule mod_cgi.c>
          Define ENABLE_GITWEB
        </IfModule>
    <IfModule mod_cgid.c>
      Define ENABLE_GITWEB
    </IfModule>
  </IfModule>
</IfModule>

<IfDefine ENABLE_GITWEB>
  Alias /gitweb /usr/share/gitweb

  <Directory /usr/share/gitweb>
    Options +FollowSymLinks +ExecCGI
    AddHandler cgi-script .cgi
  </Directory>
</IfDefine>

因此,如果您使用 gitweb,则需要:mod_alias 和 mod_mime。您需要:mod_cgi 或 mod_cgid。就我而言,我有前两个,但没有后两个 cgi 模块。

要启用 mod_cgid,您需要 mpm_worker_module 或 mpm_event_module。对于 mod_cgi,您需要:mpm_prefork_module

我不知道这两个 cgis 之间有什么区别,但由于我已经有了 mpm_prefork_module,所以我决定启用后者:

sudo a2enmod cgi

就我的情况而言,对于测试服务器,我需要转到每个存储库并执行以下操作:

git update-server-info

初步测试目前已开始进行。

谨致问候 Josef

相关内容