Git服务器(3)

5 使用Git协议:Git守护进程

如果要想使用Git协议访问某个仓库,可为其配置一个Git守护进程,然后在那些无需身份验证即可访问的Git仓库中创建git-daemon-export-ok文件。

使用Git协议能够让你快速的并且无需身份验证访问Git数据,这里要在啰嗦一句,正是因为Git协议没有身份验证的功能,通过该协议传输的Git数据将在它所在的网络段内公开,这会是很大的安全隐患,这一点需要格外的注意。

架设Git协议服务是相对简单的,只需要以守护进程的方式执行命令:

$ git daemon --reuseaddr --base-path=/srv/git /srv/git

其中,--reuseaddr选项允许服务器无需等待旧的连接超时而直接重启,--base-path选项可以让用户克隆仓库时不必使用完整路径,最后的路径(/srv/git)则会告诉Git守护进程要从哪个目录读取仓库。还记得之前提到的9418端口吗?它是Git协议默认使用的端口,所以,要想让团队成员能够访问到Git协议服务,那么就需要在防火墙配置允许对服务器9418窗口的访问。

$ firewall-cmd --zone=public --add-port=9418/tcp --permanent

如果想在服务器重启时自动的为某个Git仓库提供Git协议服务,我猜你肯定不希望每次服务器重启后手动敲上述的命令。那么在不同的操作系统中,将上述命令配置为守护进程,这里以笔者使用Ubuntu 20.04操作系统为例,来演示如何把上述命令配置为守护进程:编辑文件/etc/init/local-git-daemon.conf,其中local-git-daemon.conf文件名称可自定义,写入以下内容:

start on startup
stop on shutdown
exec /usr/bin/git daemon \
    --user=git --group=git \
    --reuseaddr \
    --detach
    --base-path=/srv/git \
    /srv/git
respawn

示例中使用的用户是上一章中的git用户。但是,为了更好的安全性,强烈建议创建一个新的用户来运行Git守护进程,并且为该用户配置仓库所在路径的只读访问权限。保存该文件,在下次服务器重启时,Git守护进程也会自动启动,而且,守护进程意外中断时,进程也会自动重启。

  • 如果想手动停止守护进程:initctl stop local-git-daemon

  • 如果想手动启动守护进程:initctl start local-git-daemon

接下来还要做一步操作:为Git仓库配置git-daemon-export-ok文件,允许该仓库可无需身份验证访问,命令很简单

$ cd <target_git_repository_path>
$ touch git-daemon-export-ok

6 使用智能HTTP协议

在前面的第2章(在“Git服务器(2)文章”中)和第5章分别介绍了基于SSH访问服务和Git协议搭建Git服务器,其中SSH访问服务需要身份验证,而Git协议无需身份验证即可访问Git数据。基于智能HTTP协议搭建的Git服务器,可以同时实现基于身份验证的访问和无身份验证的访问。

配置智能HTTP协议的Git服务器,只需在服务器上启用Git自带的CGI脚本git-http-backend。该脚本将会读取基于HTTPgit fetchgit push请求的头部信息和请求的URL路径,并检查客户端是否通过HTTP通信。如果CGI脚本检测到客户端支持智能HTTP协议(也就是Git版本在1.6.6及以上),那么Git服务器会使用智能HTTP协议和客户端通信,否则,将会自动降级到非智能HTTP协议与客户端通信。

接下来将在笔者使用的Ubuntu 20.04系统中,使用Apache作为CGI服务器,来为大家演示如何搭建智能HTTP协议的Git服务器。

  1. 安装Apache
$ sudo apt install -y apache2
$ apache2 --version # 查看版本
$ sudo a2enmod cgi alias env rewrite # 启用这几个模块
  1. 设置Git仓库所在目录(以/srv/git为例)的用户组为www-data,以便Web服务器能够正常读写Git仓库
$ sudo chgrp -R www-data /srv/git
  1. 配置Apache服务器,使得任何Web服务器上对于/srv/git目录下的任何请求都会转由git-http-backend来处理
$ SetEnv GIT_PROJECT_ROOT /srv/git
$ SetEnv GIT_HTTP_EXPORT_ALL # 如果不配置该项,只会把包含git-daemon-eport-ok文件的仓库以HTTP服务的形式提供为为登录的客户端
$ ScriptAlias /git/ /usr/lig/git-core/git-http-backend/
  1. 配置Apache服务器,使其需要先提供登录验证才能进行写入操作
RewriteEngine On
RewriteCond %{QUERY_STRING}% service=git-receive-pack [OK]
RewriteCond %{REQUEST_URI}% /git/receive-pack$
RewriteRule ^/git/ - [E=AUTHREQUIRED]

<Files "git-http-backend">
    AuthType Basic
    AuthName "Git Access"
    AuthUserFile /srv/git/.htpasswd
    Require valid-user
    Order deny,allow
    Deny from env=AUTHREQUIRED
    Satisfy any
</Files>
  1. 在上面配置文件中的/srv/git目录下创建.htpasswd文件,包含所有合法用户的密码信息
$ htdigest -c /srv/git/.htpasswd jiaoxn # 将用户jiaoxn添加到该文件中

到这里,我们就完成了一个基于Apache服务器搭建智能HTTP协议的Git仓库,当然,这是很简单的一个示例。这里面呢,没有设计任何的数据加密传输,而在真正的应用中,这个必须要的。同时呢,Apache服务器提供了多种身份验证方式,可以选择一个自己能够看上眼的,这也是必需的,因为Git提供的CGI脚本没有身份验证的功能,只能在Web服务器上实现这层控制。

明天将会带来GitLab部署的实战分享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值