核心概念:Apache + Git Smart HTTP
这种方式的工作原理是:

- Apache 服务器:作为 Web 服务器,负责接收客户端(如
git clone,git push)的 HTTP 请求。 git-http-backend:这是 Git 自带的一个 CGI(通用网关接口)程序,Apache 会将 Git 相关的请求转发给这个后端程序来处理实际的 Git 数据读写操作。- 认证与授权:Apache 负责用户身份验证(比如使用 Basic Auth),并根据配置决定用户是否有权限读写特定的 Git 仓库。
优点:
- 端口简单:只需要开放标准的 80 (HTTP) 或 443 (HTTPS) 端口,防火墙配置方便。
- 集成度高:可以与现有的 Web 认证系统集成(如 LDAP, SAML)。
- 用户体验好:对用户透明,无需额外安装 Git 协议支持,直接使用
git clone http://...即可。 - 安全性:可以轻松配置 SSL/TLS 加密,保护数据传输安全。
第一步:环境准备
确保你的服务器系统已经安装了必要的软件,我们以 CentOS 7 / RHEL 7 为例,其他发行版(如 Ubuntu)的包名可能略有不同。
更新系统
sudo yum update -y
安装 Apache HTTP Server 和 Git

sudo yum install -y httpd git
启动并设置 Apache 开机自启
sudo systemctl start httpd sudo systemctl enable httpd
检查 Apache 状态:
sudo systemctl status httpd
如果看到 active (running),说明启动成功,你可以通过浏览器访问服务器的 IP 地址,应该能看到 Apache 的默认欢迎页面。
第二步:创建 Git 仓库
我们需要一个目录来存放所有的 Git 仓库,一个常见的做法是在 /var 目录下创建。

创建仓库根目录
sudo mkdir -p /var/git/repositories
设置正确的权限
这是非常关键的一步,Apache 运行在 apache 用户下(UID 通常是 48),为了让 git-http-backend 能够读写仓库,我们需要将仓库目录的所有权赋予 apache 用户。
sudo chown -R apache:apache /var/git sudo chmod -R 755 /var/git
创建一个示例 Git 仓库
# 切换到仓库目录 cd /var/git/repositories # 创建一个裸仓库(推荐用于服务器) sudo git init --bare my-awesome-project.git # 再次确保权限正确 sudo chown -R apache:apache my-awesome-project.git
注意:服务器上的仓库应该是“裸仓库”(--bare),它没有工作目录,只包含 Git 的版本历史信息。
第三步:配置 Apache 以支持 Git
我们需要配置 Apache 来识别 Git 请求并将其转发给 git-http-backend。
创建 Apache 配置文件
在 Apache 的配置目录下,创建一个新的配置文件,/etc/httpd/conf.d/git.conf。
sudo vi /etc/httpd/conf.d/git.conf
编写配置内容粘贴到 git.conf 文件中,我会详细解释每一部分的作用。
# 设置 Git 仓库的根目录
SetEnv GIT_PROJECT_ROOT /var/git/repositories
# 指定 git-http-backend 程序的路径
SetEnv GIT_HTTP_BACKEND /usr/libexec/git-core/git-http-backend
# 配置一个虚拟主机或目录来处理 Git 请求
# 这里我们直接在根目录下配置一个 /git 路径
<Location /git>
# 启用 CGI 支持,以便运行 git-http-backend
Options +ExecCGI +FollowSymLinks +SymLinksIfOwnerMatch
AddHandler cgi-script .cgi
# 设置认证方式为 Basic Auth
AuthType Basic
# 认证领域名称,会在浏览器弹窗中显示
AuthName "Git Private Area"
# 指定用户密码文件路径
# 我们将在下一步创建这个文件
AuthUserFile /etc/httpd/passwd.git
# 控制访问权限
# Require valid-user 表示所有通过认证的用户都可以访问
Require valid-user
# 对于 Git 的推送操作,需要额外设置环境变量
# SetEnvIf 用来识别请求是否是推送
SetEnvIf Request_Method "(GET|POST)" GIT_HTTP_EXPORT_ALL=1
SetEnvIf Request_Method "(GET|POST)" GIT_PROJECT_ROOT=/var/git/repositories
# 允许客户端通过 HTTP 推送代码
Require all granted
</Location>
配置解释:
SetEnv ...: 设置环境变量,告诉git-http-backend仓库在哪里以及它自身的位置。<Location /git>: 所有请求/git这个路径的请求,都会由这个配置块处理,你的仓库地址会是http://your-server/git/my-awesome-project.git。AuthType Basic: 使用最基础的 HTTP 认证方式。AuthUserFile /etc/httpd/passwd.git: 指定存储用户名和密码的文件,这个文件目前不存在,我们下一步创建。Require valid-user: 这是核心授权规则,表示只有密码文件中存在的有效用户才能访问。Require all granted: 这行很重要,它允许git-http-backend执行,否则 CGI 脚本可能因为权限问题无法运行。
重新加载 Apache 配置
sudo systemctl reload httpd
第四步:创建用户并设置密码
现在我们需要创建可以访问 Git 服务器的用户。
使用 htpasswd 创建用户和密码
htpasswd 是 Apache 自带的工具,用于管理 Basic Auth 的密码文件。
-
-c参数表示创建一个新文件(如果文件已存在,会覆盖,所以创建第一个用户时用,后续添加用户不用)。 -
第一次创建用户:
sudo htpasswd -c /etc/httpd/passwd.git git_user
系统会提示你输入并确认
git_user的密码。 -
添加第二个用户(不加
-c):sudo htpasswd /etc/httpd/passwd.git another_user
验证密码文件
你可以查看 /etc/httpd/passwd.git 文件,内容是加密后的密码串。
cat /etc/httpd/passwd.git
第五步:测试与使用
服务器端的所有配置都已完成,让我们从客户端进行测试。
在客户端克隆仓库
假设你的服务器 IP 是 168.1.100,用户是 git_user。
git clone http://git_user:your_password@192.168.1.100/git/my-awesome-project.git
如果一切正常,你应该能成功克隆到本地。
在客户端进行修改并推送
cd my-awesome-project # 创建一个新文件并提交 echo "Hello from Git HTTP Server" > README.md git add README.md git commit -m "Initial commit" # 推送到服务器 git push origin master
如果推送成功,说明你的 Git 服务器已经可以正常工作了!
第六步(推荐):配置 HTTPS(SSL/TLS)
在生产环境中,强烈建议使用 HTTPS 来加密传输,防止密码和代码在传输过程中被窃听。
安装 mod_ssl 模块
sudo yum install -y mod_ssl
获取 SSL 证书 你可以从 Let's Encrypt 免费获取,或者使用自签名证书进行测试。
- 自签名证书(仅用于测试):
sudo openssl genrsa -out /etc/pki/tls/private/your_server.key 2048 sudo openssl req -new -x509 -key /etc/pki/tls/private/your_server.key -out /etc/pki/tls/certs/your_server.crt -days 365
在生成过程中,会要求你填写一些信息,Common Name 建议填写你的服务器域名或 IP。
修改 SSL 配置文件
编辑 /etc/httpd/conf.d/ssl.conf,修改 SSLCertificateFile 和 SSLCertificateKeyFile 的路径指向你刚刚生成的证书和密钥。
强制 HTTP 重定向到 HTTPS
在 /etc/httpd/conf.d/git.conf 的开头添加以下内容:
<VirtualHost *:80>
ServerName your-server-domain.com
Redirect permanent / https://your-server-domain.com/
</VirtualHost>
<VirtualHost *:443>
ServerName your-server-domain.com
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/your_server.crt
SSLCertificateKeyFile /etc/pki/tls/private/your_server.key
# ... (把之前 <Location /git> 的所有内容放在这里) ...
<Location /git>
Options +ExecCGI +FollowSymLinks +SymLinksIfOwnerMatch
AddHandler cgi-script .cgi
AuthType Basic
AuthName "Git Private Area"
AuthUserFile /etc/httpd/passwd.git
Require valid-user
SetEnvIf Request_Method "(GET|POST)" GIT_HTTP_EXPORT_ALL=1
SetEnvIf Request_Method "(GET|POST)" GIT_PROJECT_ROOT=/var/git/repositories
Require all granted
</Location>
</VirtualHost>
重启 Apache
sudo systemctl restart httpd
你的 Git 服务器只能在 HTTPS 下访问了,安全性大大提高。
总结与后续优化
至此,你已经成功搭建了一个功能完备、安全的 Apache Git 服务器。
后续可以考虑的优化方向:
- 使用更安全的认证方式:Basic Auth 的密码是 Base64 编码的,虽然 HTTPS 加密了通道,但仍有更现代的方案,如集成 LDAP/AD 进行统一身份认证。
- 细粒度权限控制:目前所有认证用户对所有仓库都有读写权限,如果你需要精细控制(比如某些用户只能读,某些用户能读写),可以考虑使用 Gitolite 或 GitLab,Gitolite 通过管理一个特殊的
gitolite-admin仓库来配置所有用户和仓库的权限,与 Apache 结合得非常好。 - Web 界面:如果你希望有一个 Web 界面来浏览仓库,可以安装 GitList 或 cgit 等轻量级工具,它们可以很好地与 Apache 集成。
- 性能优化:对于非常大的仓库或高频访问,可以考虑启用 Apache 的缓存模块或使用更专业的负载均衡方案。
希望这份详细的指南能帮助你成功搭建自己的 Git 服务器!
