应在项目根目录执行go env -w goproxy=http://your-mirror.local:8080,direct设置局域网镜像,go.mod不参与代理配置;需配合gonosumdb和goinsecure处理私有模块,并确保镜像服务响应头与go协议兼容。

go.mod 中如何设置 GOPROXY 指向局域网镜像
直接在项目根目录执行 go env -w GOPROXY=http://your-mirror.local:8080 即可生效,无需修改 go.mod 文件本身。Go 的模块代理机制由环境变量驱动,go.mod 只记录依赖声明,不参与代理路由。
常见错误是误以为要在 go.mod 里写 proxy 配置,结果无效。实际生效顺序是:命令行参数 > 环境变量 > 默认值(https://proxy.golang.org,direct)。局域网镜像必须出现在 GOPROXY 值的最前面,否则请求会先发到公网代理再 fallback。
- 多个镜像用逗号分隔,例如:
go env -w GOPROXY="http://mirror.internal:8080,https://proxy.golang.org,direct" -
direct必须保留,否则私有模块(如gitlab.example.com/internal/pkg)会因无法解析而失败 - 若镜像服务启用了 Basic Auth,URL 需含凭证:
http://user:pass@mirror.internal:8080
验证局域网镜像是否被真正使用
执行 go list -m all 或 go mod download 时,Go 会打印实际请求的 URL。观察终端输出里是否出现你的内网地址,而不是 proxy.golang.org 或原始 module path。
更可靠的方式是抓包或查镜像服务日志。比如用 curl -v http://your-mirror.local:8080/github.com/go-sql-driver/mysql/@v/v1.14.1.info,看是否返回 JSON 且状态码为 200。注意 Go 客户端对 .info、.mod、.zip 后缀有固定请求模式,镜像服务必须完整支持这三类路径。
- 如果请求卡住或返回 404,大概率是镜像未同步对应版本,或 ACL 规则拦截了
@v/路径 - 某些镜像(如 Athens)默认禁用
github.com等公共域名的代理,需显式配置allowed_licenses或allowed_hosts - Go 1.21+ 对
GOPROXY中含端口的 URL 更敏感,确保 URL 以http://开头,而非http://your-mirror.local:8080/(末尾斜杠会导致 400)
私有模块与局域网镜像共存时的关键配置
当项目同时引用公开模块(如 golang.org/x/net)和私有模块(如 git.corp/internal/lib),仅靠 GOPROXY 不够——Go 会把所有请求都发给镜像,而私有模块源通常不托管在镜像中。
此时必须配合 GONOSUMDB 和 GOINSECURE。前者跳过 checksum 验证(避免因私有模块无 sum 记录报错),后者允许绕过 TLS 检查(适配内网 HTTP 镜像或自签名 Git 服务器)。
- 设置:
go env -w GONOSUMDB="git.corp/*"(匹配私有域名) - 若私有 Git 使用 HTTP 而非 HTTPS:
go env -w GOINSECURE="git.corp" -
GONOSUMDB和GOPROXY必须协同生效,否则go get会在 checksum 阶段失败,根本不会走到代理请求
镜像服务选型与最小可用配置要点
生产环境推荐 athens 或 sonatype nexus,但调试阶段用 goproxy.cn 的 Docker 镜像快速验证更省事。关键不是功能多,而是路径兼容性和响应头正确。
Go 客户端对镜像响应有隐式要求:必须返回 Content-Type: application/json(对 .info)、application/vnd.go-mod(对 .mod)、application/zip(对 .zip),且 ETag 和 Last-Modified 头影响缓存行为。很多轻量镜像(如简单 Nginx 目录映射)因缺失这些头导致 go mod vendor 反复下载。
- 用
curl -I http://mirror.internal:8080/github.com/gorilla/mux/@v/v1.8.0.info检查响应头 - 确保镜像服务监听的是
0.0.0.0:8080而非127.0.0.1:8080,否则容器或远程开发机无法访问 - Go 工具链不支持代理身份认证的自动重试,一旦
401 Unauthorized就终止,务必提前验证凭证有效性
GOPROXY、GONOSUMDB、GOINSECURE 三者是否形成闭环,且镜像服务返回的每个字节都符合 Go 客户端的协议预期。漏掉任意一个,都会表现为“看起来配了,但没走内网”。











