我想从 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>
如果你仔细观察,你会发现我唯一的改变是:
- 已删除:“AddType application/x-httpd-php .php”。Ubuntu 中已通过“/etc/mods-enabled -> php7.0.*”启用此功能
- apache 目录已更改为 Ubuntu 目录:/etc/apache2、/var/log/apache2 和 /var/www/html
- SSLCipherSuite 稍有改变,但这应该不是问题
此项已更改:
命令允许、拒绝
允许所有人
经过:
要求所有已授予
“/home/git” 被“/var/www/html/my_domain/git” 更改。说实话,我也尝试了第一种方法,但不起作用。我见过“/var/www/html” 以外的其他文件夹不起作用的情况。
- “/usr/libexec/git-core/git-http-backend/” 被更改为:“/usr/lib/git-core/git-http-backend/”,这是该二进制文件在 Ubuntu 上所在的位置。
- “AuthzLDAPAuthoritative” 已更改为:“AuthLDAPBindAuthoritative”。第一个指令在 apache 2.4 上不再存在。
- 更改:
允许所有人
命令允许、拒绝
要求组 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