在许多遗留系统或特定网络环境中,基于 CentOS 6 的服务器仍在稳定运行,尽管该操作系统已进入生命周期尾声(EOL),但在这些系统上搭建可通过 HTTP 协议访问的 Git 仓库,依然有其现实意义,尤其是在需要穿透防火墙、提供只读访问或简化认证流程的场景下,本文将详细介绍如何在 CentOS 6 系统上,结合 Apache Web 服务器,搭建一个功能完善的 Git HTTP 服务。

环境准备与软件安装
我们需要确保系统已安装必要的软件包,我们将使用 Apache(在 CentOS 中称为 httpd)作为 Web 服务器,并安装 Git 版本控制软件。
打开终端,使用 yum 包管理器进行安装,CentOS 6 的官方源可能包含较旧版本的 Git,但对于基本功能已足够,如果需要更新版本,可以考虑配置 EPEL (Extra Packages for Enterprise Linux) 仓库。
# 安装 Apache Web 服务器和 Git sudo yum install httpd git # 启动 Apache 服务并设置为开机自启 sudo service httpd start sudo chkconfig httpd on
至此,基础环境已经准备就绪,Apache 服务正在监听 80 端口,Git 工具也已安装完毕。
创建 Git 仓库
Git 服务器需要一个地方来存储项目的版本库,我们将在 Apache 的默认网站根目录下创建一个专门的文件夹来存放所有 Git 仓库。
# 创建一个用于存放 Git 仓库的目录 sudo mkdir -p /var/www/git # 进入该目录 cd /var/www/git # 创建一个名为 "myproject" 的裸仓库 # 裸仓库没有工作目录,仅包含 Git 版本控制所需的数据,适合作为服务器端仓库 git init --bare myproject.git
创建仓库后,最关键的一步是设置正确的文件权限,Apache 进程(通常以 apache 用户身份运行)需要对仓库目录拥有读写权限,这样才能通过 HTTP 协议进行克隆和推送操作。
# 将仓库的所有权赋予 apache 用户和 apache 组 sudo chown -R apache:apache /var/www/git/myproject.git
配置 Apache 服务器
这是整个配置过程的核心,我们需要告诉 Apache 如何处理对 Git 仓库的 HTTP 请求,Git 自带了一个名为 git-http-backend 的 CGI 脚本,它专门用于此目的。
最佳实践是为 Git 配置创建一个独立的配置文件,而不是直接修改主配置文件 httpd.conf。
# 创建并编辑 Git 的 Apache 配置文件 sudo vi /etc/httpd/conf.d/git.conf
在 git.conf 文件中,添加以下内容:
# 设置 Git 仓库的根目录环境变量 SetEnv GIT_PROJECT_ROOT /var/www/git # 设置 Git 项目目录的根 URL SetEnv GIT_HTTP_EXPORT_ALL # 将 /git/ 路径的请求映射到 git-http-backend CGI 脚本 ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/ <Directory "/usr/libexec/git-core"> Options ExecCGI AllowOverride None Order allow,deny Allow from all </Directory> # 对仓库目录本身进行权限控制 <Directory "/var/www/git"> Options Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory>
配置解析:
SetEnv GIT_PROJECT_ROOT /var/www/git: 告诉git-http-backend去哪里寻找 Git 仓库。SetEnv GIT_HTTP_EXPORT_ALL: 允许所有在GIT_PROJECT_ROOT下的仓库被通过 HTTP 导出和访问。ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/: 这是关键,它将所有以/git/开头的 URL 请求转发给git-http-backend脚本处理。<Directory>块: 用于设置特定目录的访问权限和选项。Options ExecCGI允许在该目录下执行 CGI 脚本。Order allow,deny和Allow from all是 Apache 2.2 的语法,用于允许所有客户端访问。
配置完成后,保存文件并重启 Apache 服务以使更改生效。

sudo service httpd restart
启用 HTTP 推送功能
默认情况下,通过 git-http-backend 搭建的 HTTP 服务是只读的,不允许客户端执行 git push 操作,为了启用推送功能,我们需要在每个需要推送权限的裸仓库中进行设置。
cd /var/www/git/myproject.git # 启用 HTTP 接收包功能,即允许推送 git config http.receivepack true
完成此设置后,客户端就可以向该仓库推送代码了。
客户端访问与操作
服务器端配置已经全部完成,你可以在任何一台可以访问该 CentOS 6 服务器的机器上使用 Git 客户端进行操作。
克隆仓库:
# 注意 URL 格式,它对应了我们在 Apache 中配置的 ScriptAlias git clone http://<你的服务器IP地址>/git/myproject.git
提交并推送更改:
cd myproject # ... 进行一些文件修改 ... git add . git commit -m "Initial commit via HTTP" git push origin master
系统可能会提示输入用户名和密码,由于我们尚未配置认证,可以随意输入,或者直接按回车(取决于 Apache 的具体配置),只要 Apache 有权限写入仓库,推送就会成功。
(可选)增加 HTTP 基础认证
为了增加安全性,我们可以为 Git 服务添加简单的 HTTP 基础认证。
-
创建密码文件:
使用htpasswd工具创建一个用于存储用户名和密码的文件,首次创建时使用-c参数。# 创建密码文件并添加一个名为 'gituser' 的用户 sudo htpasswd -c /etc/httpd/conf.d/git.passwd gituser # 系统会提示你输入并确认密码
-
修改 Apache 配置:
再次编辑/etc/httpd/conf.d/git.conf文件,在<Directory "/var/www/git">块中增加认证相关的指令。<Directory "/var/www/git"> Options Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all # --- 以下是新增的认证配置 --- AuthType Basic AuthName "Git Repository" AuthUserFile /etc/httpd/conf.d/git.passwd Require valid-user </Directory>
-
重启 Apache:

sudo service httpd restart
当客户端再次尝试克隆或推送时,就必须提供 gituser 及其密码才能通过验证。
防火墙配置
确保 CentOS 6 的防火墙(iptables)允许 HTTP(端口 80)流量通过。
# 临时允许 80 端口 sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT # 保存规则,以防重启后失效 sudo service iptables save
至此,一个在 CentOS 6 上运行、支持读写和基础认证的 Git HTTP 服务器已完全搭建完毕。
相关问答FAQs
我在执行 git push 时,服务器返回 “error: cannot spawn… No such file or directory” 或 “service not enabled” 错误,是什么原因?
解答: 这个错误通常有两个主要原因,第一个是 git-http-backend 脚本的路径不正确,请检查 /etc/httpd/conf.d/git.conf 文件中的 ScriptAlias 指令,确保 /usr/libexec/git-core/git-http-backend 这个路径在你的系统中是真实存在的(可以使用 which git-http-backend 命令确认),第二个更常见的原因是 没有在服务器端的裸仓库中启用 HTTP 推送功能,你需要登录到服务器,进入对应的裸仓库目录(/var/www/git/myproject.git),然后执行 git config http.receivepack true 命令来显式地开启它。
客户端在克隆或推送时收到 “403 Forbidden” 错误,但我的 Apache 配置看起来是正确的,该怎么办?
解答: “403 Forbidden” 是一个权限问题,根源通常不在于 Apache 的 URL 访问规则,而在于 文件系统的权限,请务必检查你的 Git 仓库目录(如 /var/www/git/myproject.git)及其所有子文件和子目录的所有者是否为 apache 用户和 apache 组,可以使用 sudo chown -R apache:apache /var/www/git 来递归地设置所有权,也要确保 apache 用户对这些目录有读取和执行的权限,如果问题依旧,可以查看 Apache 的错误日志(通常位于 /var/log/httpd/error_log),日志中往往会提供更详细的权限拒绝信息。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!