凌峰创科服务平台

Apache如何搭建Git服务器?

核心概念:Apache + Git Smart HTTP

这种方式的工作原理是:

Apache如何搭建Git服务器?-图1
(图片来源网络,侵删)
  1. Apache 服务器:作为 Web 服务器,负责接收客户端(如 git clone, git push)的 HTTP 请求。
  2. git-http-backend:这是 Git 自带的一个 CGI(通用网关接口)程序,Apache 会将 Git 相关的请求转发给这个后端程序来处理实际的 Git 数据读写操作。
  3. 认证与授权: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

Apache如何搭建Git服务器?-图2
(图片来源网络,侵删)
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 目录下创建。

Apache如何搭建Git服务器?-图3
(图片来源网络,侵删)

创建仓库根目录

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,修改 SSLCertificateFileSSLCertificateKeyFile 的路径指向你刚刚生成的证书和密钥。

强制 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 服务器。

后续可以考虑的优化方向

  1. 使用更安全的认证方式:Basic Auth 的密码是 Base64 编码的,虽然 HTTPS 加密了通道,但仍有更现代的方案,如集成 LDAP/AD 进行统一身份认证。
  2. 细粒度权限控制:目前所有认证用户对所有仓库都有读写权限,如果你需要精细控制(比如某些用户只能读,某些用户能读写),可以考虑使用 GitoliteGitLab,Gitolite 通过管理一个特殊的 gitolite-admin 仓库来配置所有用户和仓库的权限,与 Apache 结合得非常好。
  3. Web 界面:如果你希望有一个 Web 界面来浏览仓库,可以安装 GitListcgit 等轻量级工具,它们可以很好地与 Apache 集成。
  4. 性能优化:对于非常大的仓库或高频访问,可以考虑启用 Apache 的缓存模块或使用更专业的负载均衡方案。

希望这份详细的指南能帮助你成功搭建自己的 Git 服务器!

分享:
扫描分享到社交APP
上一篇
下一篇