Go默认只信任HTTPS代理,GOPROXY设为HTTP私有地址会被忽略并降级到direct模式;Athens需HTTPS+可信证书、显式配置ATHENS_REDIS_URL、私有模块须在config.toml中逐条配置proxy.replace规则。

为什么 GOPROXY 设成私有地址后 go build 还是走公网?
根本原因是 Go 默认只信任 HTTPS 代理,且会跳过不带 https:// 前缀或证书不可信的地址。哪怕你写了 export GOPROXY=http://192.168.1.100,Go 1.13+ 会直接忽略它,降级到 direct 模式,然后去拉 proxy.golang.org。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 必须用
https://协议启动 Athens,不能只跑 HTTP;本地测试可配合mkcert生成自签名证书 + 信任根证书 - 设置时加
,direct后缀:export GOPROXY=https://athens.example.com,direct—— 缺少,direct会导致模块不存在时报错退出,而非 fallback - 验证是否生效:运行
go env GOPROXY看输出,再执行go list -m github.com/go-sql-driver/mysql@latest并抓包确认请求发到了你的 Athens 地址
Athens 容器启动时 ATHENS_STORAGE_TYPE=redis 为啥连不上?
常见错误是只配了 ATHENS_STORAGE_TYPE=redis,但没传 ATHENS_REDIS_URL,Athens 启动时静默回退到内存存储(memory),构建多次后缓存丢失,看起来像“代理没生效”。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
-
ATHENS_REDIS_URL必须显式指定,格式为redis://[:password]@host:port/db;若 Redis 无密码、端口默认,也得写成redis://localhost:6379/0 - 用
docker run启动时,推荐用--env-file隔离敏感配置,避免密码泄露到 shell 历史 - 检查日志关键行:
storage type: redis和connected to redis都出现才算真正接入成功;只看到前者说明配置未生效
公司内网没有公网域名,go get 报 x509: certificate signed by unknown authority
这不是 Athens 的问题,而是 Go 客户端校验你自签证书失败。Athens 自己可以跑 HTTP + 自签证书,但 Go 工具链默认不信任任何非系统 CA 的证书。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 不要改 Go 源码或用
-insecure(该 flag 早已移除);正确做法是把 Athens 的根证书(比如rootCA.pem)加入系统信任库,Linux 上执行:sudo cp rootCA.pem /usr/local/share/ca-certificates/ && sudo update-ca-certificates - 开发机若用 macOS,需双击证书 → “钥匙串访问” → 右键“显示简介” → “信任” → “始终信任”
- CI 流水线中,可在 job 开头加一步:
curl -sSL https://athens.example.com/ca.crt | sudo tee /usr/local/share/ca-certificates/athens.crt && sudo update-ca-certificates
私有模块 git.company.com/internal/pkg 在 Athens 里始终 404
Athens 默认只代理公开路径(如 github.com),对私有 Git 域名不做自动发现,也不会主动 clone。它需要明确知道“这个路径对应哪个 Git URL”,否则返回 404。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 在 Athens 配置文件(
config.toml)里加[[proxy.replace]]规则,例如:[proxy.replace] from = "git.company.com/internal/pkg" to = "https://git.company.com/internal/pkg.git"
- 如果私有仓库需认证,不能靠环境变量透传;必须在
to中嵌入凭证:https://token:x-oauth-basic@git.company.com/internal/pkg.git(注意:token 要 URL 编码) - 替换规则不支持通配符;
git.company.com/internal/*这种写法无效,每个模块都要单独列
最常被忽略的是:Athens 不会帮你解析 go.mod 里的 replace 或 require 版本别名,它只认原始 import 路径。所以 go get git.company.com/internal/pkg@v0.1.0 必须能直连那个 Git 地址,否则 Athens 拿不到源码就无法缓存。










