TypechoJoeTheme

IT技术分享

统计

Gitolite+GitWeb+Nginx在CentOS7搭建Git服务仓库

2018-06-09
/
0 评论
/
946 阅读
/
正在检测是否收录...
06/09

前两天,世界上最大的男性交流社区GitHub被微软收购,消息放出后,引起了行业内一片哗然,最精彩的要数各报道的评论区了,小编也是一个评论控,看评论要比看文章多,毕竟评论才是最精彩的地方。对收购一事很多人表现出了担忧和恐慌,比如GitHub家庭版、旗舰版、365版,哈哈,其实不用担忧,微软不差这点钱,相反可能提供更多的福利,比如来点免费的私有仓库也是极好的。

如果真的担忧,何不利用手头闲置的VPS自己搭建一个Git的服务仓库呢?

GitLab应该是首选的搭建Git服务的开源项目,但至少要4G的内存,这对于一般的草根站长来说,买4G内存的VPS来搭建一个私有的Git服务器有点不现实,所以小编寻求轻量级Git服务,这就是Gitolite + GitWeb + Nginx组合的原因。

前提条件

  • VPS( 至少512M内存(亲测))
  • CentOS 7

一、Git安装

# yum install git

为了方便git的管理并增强安全性,可以首先建立 git 账户

# useradd --home /home/git git
# passwd git

此时,Git 的功能就已经可以使用了

二、安装Gitolite

gitolite是一款git服务管理工具,通过公钥对用户进行认证,并能够利用配置文件进行repo的精细授权管理。

先安装依赖

# yum install perl openssh autoconf
autoconf 安装时会安装Data:Dumper模块, 安装gitolite需要该模块(踩坑)

切换到git用户,创建安装目录

# su – git  
$ cd ~  
$ mkdir bin  

克隆gitolite源码

$ git clone https://github.com/sitaramc/gitolite.git  

创建bin目录并安装gitolite 到bin目录

$ mkdir -p $HOME/bin
$ gitolite/install -to $HOME/bin

接下来配置gitolite的管理员

删除服务器上的~/.ssh/authorized_keys文件

$ rm -rf ~/.ssh/authorized_keys

在客户端生成RSA公钥,一路回车即可

$ ssh -keygen -t rsa
该公钥用于服务器免密认证,生成RSA公钥的机器就是管理Git服务的客户机

现在要把公钥重命名下(为了方便识别用户)

$ mv ~/.ssh/id_rsa.pub ~/.ssh/dunso.pub

然后上传到准备安装Git的服务器做认证。

$ scp ~/.ssh/dunso.pub git@host:/home/git/.ssh/
命令中dunso.pubhost需要换成自己的

在服务器上,使用刚上传的公钥初始化版本库

$ $HOME/bin/gitolite setup -pk dunso.pub

/home/git/repositories 里面,可以看见仓库文件.gitolite-admin.gittest.git, 一个是管理仓库的,一个是测试用

我们可以测试下ssh的公钥认证是否成功

$ ssh git@host

如果可以直接登陆上,说明公钥配置成功, 此时,dunso.pub这个公钥可以删除了.

如果需要密码, 则公钥未配置成功, 需要重新安装gitolite,重新安装前先清除之前的文件:

$ ls -a | grep gitolite | xargs rm -fr
$ rm -fr ~/repositories ~/bin  ~/projects.list ~/.ssh/authorized_keys

在客户机上,克隆.gitolite-admin.git,从而对权限进行管理

$ git clone git@host:gitolite-admin

可以看到克隆出的gitolite-admin管理库下有两个文件夹:

  • conf: 配置用户权限的文件夹
  • keydir: 公钥存放位置

关于权限的管理,此处不做介绍,请查看gitolite官方文档说明

三、安装GitWeb

GitWeb提供一个简单网页浏览的功能。

# yum install gitweb highlight
highlight用于提供代码高亮的功能

安装完成后,需要对gitweb进行一些配置。首先是/etc/gitweb.conf

# vim /etc/gitweb.conf

修改版本库主目录等内容:

$projectroot = "/home/git/repositories";
$strict_export = 1;
$home_link = $my_uri || "/";
@stylesheets = ("static/gitweb.css");
$javascript = "static/gitweb.js";
$logo = "static/git-logo.png";
$favicon = "static/git-favicon.png";
@diff_opts = ();
$feature{'blame'}{'default'} = [1];
$feature {'blame'}{'override'} = 1;
$feature {'snapshot'}{'default'} = ['zip', 'tgz'];
$feature {'snapshot'}{'override'} = 1;
$feature{'highlight'}{'default'} = [1];
  • $projectroot指定repo的目录
  • $projects_list指定 projects.list的位置
如果不指定projects.list的话,gitweb会自动在$projectroot定义的目录下递归查找合法的git repo来显示。
  • $strict_export参数规定只有显示在首页上的repo才能够被访问。
在有projects.list的情况下,该文件列出的repo才能被访问。没有这一项的话,尽管gitolite-admin这个重要目录不会在projects.list里列出,但是可以直接通过修改url参数进行访问
  • $feature数组启用了一些插件或者说特性。
  • blame可以显示代码来源人
  • snapshot提供repo的打包下载
  • highlight提供代码高亮。

此外,还需编辑gitweb主程序gitweb.cgi,这是一个使用Perl编写的脚本。

# vim /var/www/git/gitweb.cgi

修改关联的版本库主目录:

our $projectroot = "/home/git/repositories";

四、安装Spawn-fcgi

因为nginx默认是不支持cgi的,而gitweb是用cgi写的,因此需要spawn-fcgi和fcgiwrap的辅助

# yum install spawn-fcgi
# cd ~
# git clone git://github.com/gnosek/fcgiwrap.git
# cd fcgiwrap
# yum install fcgi-devel make automake autoconf gcc
# autoreconf -i
# ./configure
# make
# make install

全部安装完后注意检查以下必要文件是否存在

  • /etc/init.d 目录下有一个spawn-fcgi程序
  • /usr/bin 目录下有一个spawn-fcgi程序
  • /var/www/git目录下是gitweb所有的文件(网页版git)
  • /etc/目录下有一个gitweb.conf文件
  • /etc/sysconfig/目录下有一个spawn-fcgi文件

这种使用fcgiwrap的方式是很简单粗暴的,跟用php-fpm不分pool一样。不过这里fcgiwrap仅用来跑gitweb一个应用,可以凑合着用。

修改/etc/sysconfig/spawn-fcgi文件,在文件的末尾添加:

FCGI_SOCKET=/var/run/fcgiwrap.socket
FCGI_PROGRAM=/usr/local/sbin/fcgiwrap
FCGI_USER=nginx
FCGI_GROUP=nginx
FCGI_EXTRA_OPTIONS="-M 0700"
OPTIONS="-u $FCGI_USER -g $FCGI_GROUP -s $FCGI_SOCKET -S $FCGI_EXTRA_OPTIONS -F 1 -P /var/run/spawn-fcgi.pid -- $FCGI_PROGRAM"

启动spawn-fcgi

# chkconfig --levels 2345 spawn-fcgi on
# /etc/init.d/spawn-fcgi start

把spawn-fcgi设为开机启动,并启动该服务,该服务成功启动后会在/var/run目录下生成一个fcgiwrap.socket文件

五、 Nginx安装配置

上面已经完成了fcgi的安装运行。还需要对nginx的conf进行配置,才能将.cgi的请求转发给fcgiwrap.socket

首先安装nginx

# yum install nginx

添加配置文件 /etc/nginx/conf.d/gitweb.conf

vim /etc/nginx/conf.d/gitweb.conf

内容如下

server {
        server_name host;
        listen 80;
        access_log /var/log/nginx/gitweb.access.log;
        error_log /var/log/nginx/gitweb.error.log;
        charset utf-8;
        location /gitweb.cgi {
                fastcgi_pass unix:/run/fcgiwrap.socket;
                fastcgi_param PATH_INFO $uri;
                fastcgi_param GITWEB_CONFIG /etc/gitweb.conf;
                fastcgi_param SCRIPT_FILENAME /var/www/git/gitweb.cgi;
                include fastcgi_params;
        }
        location / {
                root /var/www/git/;
                index gitweb.cgi;
        }
}
记得把host换成自己的

将用户 nginx 加入 git 组

# usermod -a -G git nginx
这步操作的目的,是为了让 nginx 能有权限读取仓库的内容(Nginx 默认的启动用户是 nginx),而且一定要重启一下 fcgiwrap ,否则无法立刻生效
# systemctl restart fcgiwrap

把nginx设置为开机启动

# chkconfig --levels 235 nginx on
# systemctl start nginx

六、防火墙配置

若要gitweb能够访问,需要防火墙允许web服务。

首先检查防火墙是否正在运行

# systemctl status firewalld | grep Active

查看80端口是否开启

# firewall-cmd --query-port=80/tcp

如果没有开启,需要允许WEB服务:

# firewall-cmd --permanent --add-service=http
# firewall-cmd --zone=public --add-port=80/tcp --permanent  
# firewall-cmd --reload

另外如果买的VPS,也需要到对应云平台的安全组中,开放80端口

七、配置文件系统的权限

主要处理repositories的权限问题,否则会出现404 no projects found错误

首先要修改/home/git/.gitolite.rc中的UMASK,将0007修改为0027

然后执行:

# chmod 775 /home/git
# chmod 775 /home/git/projects.list
# chmod 775 /home/git/repositories
Gitweb通过projects.list读取并决定哪些repo能够显示(确切说是显示在首页)
在Gitolite中,需要对特定repo设置权限 R = gitweb 才能使该repo被加入到projects.list当中。

一切就绪后,热更新nginx

# nginx -s reload

此时访问http:host,就能够看到gitweb页面了

八、美化界面

gitweb 默认的用户界面太过丑陋,可以使用gitweb-theme对其进行美化

将gitweb-theme的css替换/var/www/git/static/gitweb.css文件即可(记得对源文件做备份)!

九、 给gitweb加上用户密码

其实,这是一个属于nginx的http访问认证的问题,如果你的项目希望被别人访问到,那么这个步骤可以省略了。

我们可以用htpasswd这个工具来完成用户名密码的加密

# htpasswd bc /var/www/git/.htpasswd dunso 123456
htpasswd 命令最后两个参数是账号和密码。

重新配置nginx

server {
        server_name host;
        listen 80;
        access_log /var/log/nginx/gitweb.access.log;
        error_log /var/log/nginx/gitweb.error.log;
        charset utf-8;
        location /gitweb.cgi {
                fastcgi_pass unix:/run/fcgiwrap.socket;
                fastcgi_param PATH_INFO $uri;
                fastcgi_param GITWEB_CONFIG /etc/gitweb.conf;
                fastcgi_param SCRIPT_FILENAME /var/www/git/gitweb.cgi;
                include fastcgi_params;
                auth_basic "gitweb-auth";
                auth_basic_user_file /var/www/git/.htpasswd;
        }
        location / {
                root /var/www/git/;
                index gitweb.cgi;
        }
}

热更 Nginx 配置

# nginx -s reload

再次访问http:host, 就需要密码了。

十、参考文献

感谢相关文献的作者!

朗读
赞 · 0
版权属于:

IT技术分享

本文链接:

https://idunso.com/archives/2757/(转载时请注明本文出处及文章链接)