顿搜
Gitolite+GitWeb+Nginx在CentOS7搭建Git服务仓库
前两天,世界上最大的男性交流社区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 autoconfautoconf 安装时会安装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.pub和host需要换成自己的
在服务器上,使用刚上传的公钥初始化版本库
$ $HOME/bin/gitolite setup -pk dunso.pub去/home/git/repositories 里面,可以看见仓库文件.gitolite-admin.git和test.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 highlighthighlight用于提供代码高亮的功能
安装完成后,需要对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/repositoriesGitweb通过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 123456htpasswd 命令最后两个参数是账号和密码。
重新配置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, 就需要密码了。
十、参考文献
感谢相关文献的作者!
- [1] 搭建小型 Git 服务器
- [2] centos gitolite 安装 配置 详解
- [3] centos+git+gitolite 安装和部署
- [4] Git / Gitolite 的应用学习
- [5] sitaramc/gitolite
- [6] 在CentOS上搭建git服务器
- [7] CentOS Gitweb Nginx 私服搭建
- [8] gitweb simple usage on CentOS 7.2
- [9] 配置Gitolite+Gitweb+Nginx
- [10] Centos 7 + Nginx + Gitweb Kurulumu
- [11] CentOS 部署 Git 服务器
- [12] CentOS环境下使用GIT基于Nginx的私服搭建全过程
- [13] CentOS上搭建Git服务器
- [14] Install/Setup and configure Git Server with Gitolite and Gitweb on CentOS/RHEL 6.4