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
。该脚本将会读取基于HTTP
的git fetch
和git push
请求的头部信息和请求的URL
路径,并检查客户端是否通过HTTP
通信。如果CGI
脚本检测到客户端支持智能HTTP
协议(也就是Git
版本在1.6.6及以上),那么Git
服务器会使用智能HTTP
协议和客户端通信,否则,将会自动降级到非智能HTTP
协议与客户端通信。
接下来将在笔者使用的Ubuntu 20.04
系统中,使用Apache
作为CGI
服务器,来为大家演示如何搭建智能HTTP
协议的Git
服务器。
- 安装
Apache
:
$ sudo apt install -y apache2
$ apache2 --version # 查看版本
$ sudo a2enmod cgi alias env rewrite # 启用这几个模块
- 设置
Git
仓库所在目录(以/srv/git
为例)的用户组为www-data
,以便Web
服务器能够正常读写Git
仓库
$ sudo chgrp -R www-data /srv/git
- 配置
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/
- 配置
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>
- 在上面配置文件中的
/srv/git
目录下创建.htpasswd
文件,包含所有合法用户的密码信息
$ htdigest -c /srv/git/.htpasswd jiaoxn # 将用户jiaoxn添加到该文件中
到这里,我们就完成了一个基于Apache
服务器搭建智能HTTP
协议的Git
仓库,当然,这是很简单的一个示例。这里面呢,没有设计任何的数据加密传输,而在真正的应用中,这个必须要的。同时呢,Apache
服务器提供了多种身份验证方式,可以选择一个自己能够看上眼的,这也是必需的,因为Git
提供的CGI
脚本没有身份验证的功能,只能在Web
服务器上实现这层控制。
明天将会带来GitLab
部署的实战分享。