背景
一般公司都会有自己的私有框架或者公共函数库,这些大都会部署在公司私有的gitlab上 通过配置 GOPRIVATE 可以使 go-get 不走代理而直接访问私有库,但是 go get 默认会使用https 去请求私库
问题
私有库不支持https, 仅支持 http 私库端口号不是默认80端口
# 如果80端口被占用或者考虑到暴露80端口可能存在被攻击的风险,通常代码仓库可能不会用默认端口。
# go get 拉取仓库代码时不允许加端口号,不是默认端口时会报 unknown import path
解决办法
# 添加 GOINSECURE 环境变量
GOINSECURE=git.private.com // 此处设置为私库域名
# 配置nginx反向代理,将gitlab服务端口转发。
需要注意的是,goget会通过发起https请求去获取仓库的真实路径,所以要伪造一个goget响应,避免验证匹配规则时失败
# 新建nginx配置文件
sudo vim /etc/nginx/conf.d/git.private.com.conf
# 添加如下配置
server {
listen 80;
listen 443 ssl;
server_name gitlab.private.com;
# 伪造goget响应,使得内部验证规则通过
if ($args ~* "^go-get=1") {
set $condition goget;
}
if ($uri ~ ^/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)(/[\p{L}0-9_.\-]+)*$) {
set $condition "${condition}path";
}
if ($condition = "gogetpath") {
return 200 "<!DOCTYPE html><html><head><meta content='gitlab.private.com/$1/$2 git http://gitlab.
private.com/$1/$2.git' name='go-import'></head></html>";
}
location / {
proxy_pass http://git.private.com:9999;
}
ssl_certificate cert/private.com.pem;
ssl_certificate_key cert/private.com.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
}
参考
goget取包原理 https://studygolang.com/articles/18726