用Nginx搭建自己的私有Git服务器
背景
现在Github的私有仓库已经无限制免费了,但是Geek精神总是在召唤我似乎可以自己搭建一台自己的私有Git服务器?(你甚至可以写个后台前端搭建一个自己的Github!额,貌似是Gitlab?)
说干就干!
环境
- Ubuntu 20.04 LTS
- git version 2.25.1
- nginx version: nginx/1.17.10 (Ubuntu)
目标
- 搭建自己的私有Git仓库
- 通过http访问
- 增加ssl
搭建Git仓库
个人习惯用root用户操作,不用每个命令前增加sudo。可以先切到root用户操作
1 | sudo -i |
安装 git
1
apt install git -y
创建 git 用户
1
adduser git
初始化仓库
初始化你的Git仓库根目录,例如我放在
/home/git/wudinaonao/
这个目录1
2cd /home/git/wudinaonao/
git init --bare test.git这样我们创建了一个测试仓库
test.git
- 禁用Git用户登录Shell
编辑/etc/passwd
文件找到这行
1 | git:x:1001:1001:,,,:/home/git:/bin/bash |
改为
1 | git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell |
- 克隆远程仓库
格式
1 | git clone <user>@<host>:<path> |
例如根据刚才我们创建的仓库我们输入
1 | git clone git@172.16.105.203:/home/git/wudinaonao/test.git |
然后输入密码
这样就克隆到了本地。
使用Nginx通过HTTP访问Git仓库
安装软件包
1
apt-get install git-core nginx fcgiwrap
配置 Nginx
例如我想通过
/wudinaonao/xxx.git
这样的路径来访问服务器上xxx.git
仓库,我们可以修改nginx默认网站配置文件/etc/nginx/sites-available/default
修改信息1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21# wudinaonao 的 Git 仓库
location ~ /wudinaonao(/.*) {
# 使用 Basic 认证
auth_basic "Restricted";
# 认证的用户文件
auth_basic_user_file /etc/nginx/passwd;
# FastCGI 参数
fastcgi_pass unix:/var/run/fcgiwrap.socket;
fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend;
fastcgi_param GIT_HTTP_EXPORT_ALL "";
# git 库在服务器上的跟目录
fastcgi_param GIT_PROJECT_ROOT /home/git/wudinaonao;
fastcgi_param PATH_INFO $1;
# 将认证用户信息传递给 fastcgi 程序
fastcgi_param REMOTE_USER $remote_user;
# 包涵默认的 fastcgi 参数;
include fastcgi_params;
# 将允许客户端 post 的最大值调整为 100 兆
# max_client_body_size 100M;
}创建Nginx认证用户文件
参考 nginx ngx http auth basic module , 用户认证文件格式如下:
1
2
3
4
name1:password1
name2:password2:comment
name3:password3推荐使用
htpasswd
命令创建用户,可以通过apt install apache2-utils
安装创建文件
1
touch /etc/nginx/passwd
创建一个用户 user
1
htpasswd /etc/nginx/passwd user
根据提示输入密码。
重启Nginx测试
1
nginx -s reload
格式
1
git clone http://<your hostname or ip>/<your path>/<your repository>.git
例如
1
git clone http://172.16.105.205/wudinaonao/test.git
- 成功
增加SSL证书
申请证书
- 找你的域名提供商申请一个证书,或者用免费的letsencrypt证书。
- 申请过程不赘述
配置Nginx
配置 ssl
默认配置文件
/etc/nginx/sites-available/default
修改server
段1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# 监听 443 端口, https 协议的默认端口
listen 443 ssl;
# 绑定证书的域名
server_name git.wudinaonao.com;
# 证书路径
ssl_certificate /etc/nginx/ssl/git.wudinaonao.com.crt;
# 私钥路径
ssl_certificate_key /etc/nginx/ssl/git.wudinaonao.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;成功
可能出现的问题
Nginx
- FastCGI sent in stderr: “fatal: GIT_PROJECT_ROOT is set but PATH_INFO is not” while reading response header from upstream,
克隆仓库时候服务器响应 code 5000
查看nginx日志
- 可能的原因,设置了GIT_PROJECT_ROOT但是没有获取到PATH_INFO,网站路径设置错误
把
1 | location ~ /wudinaonao |
这里改成
1 | location ~ /wudinaonao(/.*) |
- 问题解决
error: remote unpack failed: unable to create temporary object directory
在 git push 的时候有时候会无法 push 上去的情况。
错误显示无法创建对象。这种错误一般是目录权限设置的问题。重新设置一下目录权限即可。
例如如果我通过http的方式push,那么我需要设置目录的用户组和你web服务器的用户组一样。
例如我的nginx用户为www-data,那么远程主机的blog.wudinaonao.com.git目录的用户也要是www-data.
使用 chmod 设置权限,直接 chmod -R 777
- 问题解决
参考链接
https://www.liaoxuefeng.com/wiki/896043488029600/899998870925664
https://beginor.github.io/2016/03/12/http-git-server-on-nginx.html
https://git-scm.com/book/zh/v2/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84-Git-Smart-HTTP