私有goproxy服务必须监听https或通过goinsecure显式允许http连接,且goproxy需配置为多级fallback(如http://your-proxy.internal,direct),direct必须小写并置于末尾;私有模块域名须通过goprivate显式声明(如git.internal.company),否则代理会泄露凭证。

私有 Goproxy 服务必须监听 HTTPS 或显式禁用 TLS 校验
Go 工具链默认要求代理地址使用 HTTPS,否则会报 Get "http://your-proxy:8080/...": http: server gave HTTP response to HTTPS client。如果你用 Docker 或二进制部署了 Athens、goproxy.io 自建版或 Nexus Go Proxy,且监听在 http://localhost:8080,必须加 GOINSECURE 才能跑通。
正确做法是:要么反向代理(如 Nginx)套一层 HTTPS,要么设置环境变量让 Go 接受指定域名的 HTTP 连接:
-
export GOINSECURE="your-proxy.internal"(Linux/macOS) -
$env:GOINSECURE="your-proxy.internal"(PowerShell) - 值必须和
GOPROXY中的域名完全一致,不支持路径或端口,只认 host - 不能设成
*或all,Go 不识别这种写法
GOPROXY 链里 direct 必须放在最后,且不能省略
团队私有模块通常托管在 GitLab、Gitee 或自建 Gitea,地址形如 git.internal.company/mylib。如果 GOPROXY 设为 http://your-proxy.internal,direct,Go 会先尝试走代理;若代理返回 404(说明没缓存该私有模块),才 fallback 到直连——这是唯一能同时兼顾加速 + 私有模块拉取的写法。
常见错误配置:
-
GOPROXY=http://your-proxy.internal:漏掉,direct,所有私有模块直接 404 -
GOPROXY=direct,http://your-proxy.internal:顺序反了,先直连再代理,完全失去加速意义 -
GOPROXY=http://your-proxy.internal,https://goproxy.cn:没,direct,私有模块无法回源
GOPRIVATE 必须显式声明私有域名,否则代理会转发认证信息
当 Go 尝试从 git.internal.company/mylib 拉模块时,若没设 GOPRIVATE,它会把请求(含可能的 token 或 SSH key)发给你的私有 Goproxy,而这个代理大概率不具备鉴权能力,导致 401 或 403。
Go语言(Golang)1.26.0版本提供 Go 官方 Windows amd64 MSI 安装包下载入口,版本号 1.26.0,可用于旧项目维护、兼容性测试和指定版本开发环境配置。
解决方法是让 Go 跳过代理,直连 Git 服务器:
-
export GOPRIVATE="git.internal.company"(支持通配符,如*.internal.company) - 多个域名用逗号分隔:
GOPRIVATE=git.internal.company,gitee.com/private-repo - 注意:这和
GOINSECURE是两回事——GOPRIVATE控制是否走代理,GOINSECURE控制是否校验 TLS - 如果私有仓库用 SSH(
git@git.internal.company:mylib),还需确保~/.ssh/config或~/.netrc配置正确,Goproxy 不参与 SSH 流程
CI/CD 和开发者本地环境要统一 GOPROXY 配置方式
很多团队只在本地 shell 里 export 了 GOPROXY,但 CI 脚本(如 GitHub Actions、GitLab CI)运行在干净容器里,环境变量为空,导致构建失败。
推荐做法:
- CI 脚本开头显式设置:
go env -w GOPROXY="http://your-proxy.internal,direct"和go env -w GOPRIVATE="git.internal.company" - 避免依赖 shell 配置文件(如
.zshrc),因为 CI 不 source 它们 - IDE(如 GoLand)可能缓存旧配置,改完后执行
go clean -modcache并重启 IDE - 验证是否生效:运行
go mod download -x github.com/gorilla/mux@v1.8.0,看日志里请求的是不是你私有代理地址
最易被忽略的是 GOPRIVATE 和 GOINSECURE 的组合逻辑:前者决定“走不走代理”,后者决定“敢不敢连 HTTP”。少一个,私有模块就卡在认证或协议错误上,而不是慢——问题表现像网络不通,实际是策略没对齐。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










