天天看点

怎么让nginx充当git服务器

作者:底层技术栈

nginx,是当前最流行的web服务器。

git,是当前最流行的代码管理工具。

我们经常使用的是git的客户端功能,而开源网站要提供git的服务器功能。

git服务器一般包含ssh和http两种协议的上传和下载,并且要支持网页版的代码浏览。

目前开源的代码库软件很多(例如gitlab),但我觉得最好用的还是git自带的gitweb。

接下来说说怎么在nginx上部署gitweb。

1,gitweb和perl语言

gitweb是用perl语言写的一个CGI脚本。

perl是非常古老的编程语言,在php出现之前曾被广泛用在网站的后端。

perl流行的时候是三十年前,我学编程的时候php已经是“最好的语言”了[捂脸]

perl这种“上古脚本”要运行起来,不但需要nginx服务器,还需要fcgiwrap。

nginx用来处理http请求,fcgiwrap负责把http里包含的网页内容传递给perl脚本。

perl语言的背景说完了,接下来直接看nginx支持gitweb时的配置文件。

2,nginx的配置文件

如下图,第1个框就是gitweb脚本的配置,文件fcgiwrap.socket就是nginx和fcgiwrap之间的通讯工具,它是一个AF_UNIX域的socket文件,位于/var/run目录。

在unix上一切都是文件,包括socket。

常用的socket只有两种,一种是AF_INET用于网络通信,另一种是AF_UNIX用于本机的进程间通信。

nginx和fcgiwrap,就是同一台电脑上的不同进程。

怎么让nginx充当git服务器

nginx.conf文件的内容

第3个框的内容,是把服务器的主页也设置成gitweb脚本,所以访问/gitweb.cgi与访问服务器的根目录的效果是相同的。

第2个框的内容,是处理通过http协议的代码上传和下载。

这里要用到一个程序git-http-backend,它是git自带的http处理工具,配置项里的目录是它的默认安装路径。

3,nginx和fcgiwrap的启动

配置好nginx之后要先启动fcgiwrap,命令如下:

sudo fcgiwrap -f -s unix:/var/run/fcgiwrap.socket &

要让它以root身份运行,否则没有权限在/var/run目录下创建文件。

命令末尾的符号&表示后台运行,这样退出shell之后fcgiwrap会继续运行。

然后把fcgiwrap.socket文件的权限设置成0777,以免因为权限不够而出错,命令如下:

sudo chmod 0777 /var/run/fcgiwrap.socket

然后启动nginx,命令为:sudo nginx

nginx也要以root身份运行,否则没法绑定80端口(http端口)。

现在可以在浏览器里输入http://127.0.0.1来看代码了,效果如下:

怎么让nginx充当git服务器

gitweb的效果图

4,代码的下载与上传

下载代码的命令是:git clone http://127.0.0.1/gitweb/A/.git

下载成功之后,把修改之后的代码再上传到服务器,命令是:git push origin master

默认情况下,服务器上的代码库是不允许上传代码的,要在配置项里打开它。

把服务器上的A/.git/config文件修改成下图这样,就可以上传代码了。

怎么让nginx充当git服务器

修改项目A的config文件,打开上传功能

上传的效果图如下:

怎么让nginx充当git服务器

上传的效果图

gitweb是一个非常小的网页浏览器,只有一个perl文件、一个js文件、一个css文件、外加两张图片。

我就喜欢这种轻量级的模块,不喜欢庞大的框架。

继续阅读