单个 GOPROXY 镜像失效主因是 CDN 缓存未刷新、上游删 tag 或证书过期,Go 仅对网络超时轮询,404 不触发 fallback;正确配置需逗号分隔多源并以 direct 结尾,内网环境须移除 direct 并确保私有模块可命中。

国内用户配置 GOPROXY 时只写一个镜像地址,遇到 404 或同步延迟就直接失败——这不是代理“不稳定”,而是配置没留 fallback 路径。
为什么单个代理会突然失效?
goproxy.cn、阿里云镜像等服务本身很稳,但失效常来自三个不可控点:CDN 节点缓存未刷新、上游模块作者删了 tag、或证书临时过期。Go 不会在返回 404 Not Found 时自动切下一个代理,它只对网络层错误(如 dial tcp: i/o timeout)才轮询。
-
go: downloading example.com/v2 v2.1.0: reading https://goproxy.cn/example.com/v2/@v/v2.1.0.info: 404 Not Found→ 命令立即退出,不尝试后续地址 - 私有模块(如
git.internal.company.com/mylib)在代理里查不到,没direct就彻底卡死 - Go 1.21+ 默认
GOPROXY=https://proxy.golang.org,direct,但proxy.golang.org在国内基本不可用,必须显式覆盖
多代理源的正确写法与顺序
逗号分隔的列表不是“越多越好”,而是按优先级逐个试,第一个成功即止。关键在顺序和兜底逻辑。
- 把响应最快、同步最及时的放最前,例如:
https://goproxy.cn(七牛)或https://mirrors.tuna.tsinghua.edu.cn/goproxy/(清华) - 中间可加一个备用镜像,比如
https://mirrors.aliyun.com/goproxy/,避免单点故障 -
direct必须放在最后,且不能省略——它不是“备选代理”,而是“跳过代理直连原始域名”的指令 - 不要混入
https://proxy.golang.org,它在国内几乎必然超时,反而拖慢整个链路
推荐命令:go env -w GOPROXY=https://goproxy.cn,https://mirrors.tuna.tsinghua.edu.cn/goproxy/,direct
立即学习“go语言免费学习笔记(深入)”;
企业内网或 CI 环境要禁用 direct
内网防火墙通常禁止出向 HTTPS 直连,direct 会导致模块拉取失败并报错 connection refused,此时必须移除 direct 并确保所有依赖都能被内部代理命中。
- 先验证:运行
go mod download -x,观察是否所有模块都走内部代理地址(如https://my-goproxy.internal.company.com) - 若存在私有模块(如
git.corp.example.com/lib),需额外配GONOSUMDB=git.corp.example.com,否则校验和检查会因无法访问官方 checksum 服务而失败 - CI 流水线中建议用
go env -w GOPROXY=https://my-goproxy.internal.company.com,不带任何逗号或direct
验证代理是否真正生效
别只看 go env GOPROXY 输出,要测真实行为。
- 执行
go list -m github.com/go-sql-driver/mysql,正常应在 1 秒内返回版本信息;如果卡住或报Get https://proxy.golang.org/...,说明配置没生效 - 临时改用其他镜像调试:
GOPROXY=https://goproxy.io,direct go list -m golang.org/x/net,避免污染全局环境 - 遇到
checksum mismatch时,先go clean -modcache再重试,别急着关GOSUMDB
最易忽略的是:代理配置只影响 go mod 和 go get,不影响你代码里的 http.Client 请求——那得另外配 http.Transport.Proxy。


















