Go代理必须设为http://localhost:8081/repository/golang-proxy/(末尾斜杠不可省),否则路径拼接错误导致404;需安装nexus-golang-plugin插件、启用golang-proxy仓库类型而非golang-group,关闭Strict Content Validation,并配合GO_PRIVATE与NO_PROXY处理私有模块。

Go 代理必须设为 http://localhost:8081/repository/golang-proxy/ 才能命中 Nexus 的 Golang 代理仓库
很多人配了 Nexus,但 go mod download 依然走公网,根本原因是 Go 客户端只认标准路径格式。Nexus 默认创建的 Golang 代理仓库(如 golang-proxy)对外暴露的 URL 必须以斜杠结尾,且不能带 /v2 或其他后缀——Go 的 GO_PROXY 会直接拼接模块路径,比如请求 github.com/go-yaml/yaml/@v/v2.4.0.info,若代理地址末尾缺 /,就会变成 http://localhost:8081/repository/golang-proxygithub.com/...,404。
实操建议:
- 确认 Nexus 中该仓库的 “Repository Path” 配置页里,“Public URL” 显示的是完整可访问地址,例如
http://localhost:8081/repository/golang-proxy/(注意末尾斜杠) - 设置代理时用
export GO_PROXY="http://localhost:8081/repository/golang-proxy/",别漏斜杠 - 如果 Nexus 启用了身份验证(比如开启了 Realm),Go 默认不传凭据,需额外配置
GO_PRIVATE+ 凭据文件,否则 401
启动 Nexus 前必须启用 golang-proxy 仓库类型并禁用默认的 golang-group
Nexus OSS 3.x 默认不自带 Golang 插件,需手动安装;即使装了,新建仓库时选 “golang (proxy)” 才真正支持 Go 模块语义(如 @v/list、@v/v1.2.3.info)。而 golang-group 是聚合视图,本身不缓存,也不响应 Go 客户端的 discovery 请求,纯属干扰项。
常见错误现象:
立即学习“go语言免费学习笔记(深入)”;
- 设置
GO_PROXY后go list -m all报错invalid version: unknown revision,其实是代理返回了 HTML 页面(Nexus 登录页或 404) - 仓库列表里看到
golang-group就以为“已就绪”,结果它根本不处理/@v/路径 - 没安装 Golang 插件(
nexus-golang-plugin),新建仓库时压根没有golang (proxy)类型可选
插件安装路径:$NEXUS_HOME/deploy/ 下放 nexus-golang-plugin-*.jar,重启 Nexus 后在 “Repository → Create repository” 才会出现对应类型。
GO_PRIVATE 和 NO_PROXY 要配合用,否则私有模块绕不过代理
本地开发中引用公司内网 GitLab 的模块(如 gitlab.example.com/myorg/lib)时,Go 默认仍会先查代理,导致 404 或超时。仅靠 GO_PROXY 不够,必须明确告诉 Go:“这些域名不走代理”。
使用场景:
- 私有模块域名不在公网,又不想每次
go get都手动加-insecure - 混合使用 Nexus 缓存 + 直连内网 Git 服务器
实操建议:
- 设
export GO_PRIVATE="gitlab.example.com,bitbucket.internal"(逗号分隔,不带协议) - 同时设
export NO_PROXY="localhost,127.0.0.1,gitlab.example.com",避免代理尝试连接内网地址失败拖慢命令 -
GO_PRIVATE只影响模块解析逻辑(跳过代理),NO_PROXY影响底层 HTTP 请求路由,两者缺一不可
Nexus 的 golang-proxy 仓库要开 “Strict Content Validation” 吗?不开
这个开关默认开启,但对 Go 模块是反效果的。Go 官方要求代理返回的 .info、.mod、.zip 文件必须严格匹配模块路径和版本规则,而 Nexus 在校验时会检查文件名是否含非法字符、路径是否规范,容易把合法的 Go 模块(比如带 + 或 % 的版本号)误判为恶意内容,返回 400。
性能与兼容性影响:
- 开启后,首次拉取某些第三方模块(如
cloud.google.com/go@v0.110.0)可能失败,日志里出现Content validation failed for path ... - 关闭后 Nexus 仍能正常缓存和重定向,只是少一层冗余校验,对 Go 场景无实质安全增益
- 该选项不影响 checksum 验证(Go 客户端自己做)
位置:仓库配置页 → “Configuration” 标签 → 取消勾选 “Strict content validation”。
最常被忽略的是:改完配置不重启 Nexus,或改了但没点 “Save”,看着像生效了,其实请求还是走旧逻辑。










