根本原因是go默认直连不可达的https://proxy.golang.org;应设goproxy=https://goproxy.cn,direct并配gonoproxy/gonosumdb跳过私有模块代理,且两值必须完全一致,否则私有模块仍被发往代理导致403或lookup failed。

在使用 Echo 框架开发 Go 项目时,执行 go mod download 或 go build 卡住几十秒后报 context deadline exceeded 或 dial tcp: i/o timeout,根本不是网络差,而是 Go 默认直连不可达的 https://proxy.golang.org;必须显式配置国内代理并确保 fallback 机制生效,否则依赖拉取必然失败。
确认当前代理是否真在起作用
别只看 go env GOPROXY 输出,要验证实际行为:
运行 go mod download -x github.com/labstack/echo/v4@v4.12.0,观察最后打印出的 GET 请求 URL——如果仍是 proxy.golang.org,说明配置未生效;若出现 goproxy.cn,才表示代理链已接管。
新开终端后记得重新加载 shell 配置(如 source ~/.zshrc),IDE 内置终端可能未继承最新环境变量。
永久设置 GOPROXY 国内镜像
方法一:使用 go env -w(推荐)
执行:go env -w GOPROXY=https://goproxy.cn,direct
【direct不能省略】 否则私有模块、本地 replace 或公司内网仓库会直接 404,Go 不会自动 fallback 到直连。
方法二:通过环境变量(适用于 Docker/CI 场景)
在 shell 中运行:export GOPROXY=https://goproxy.cn,direct
注意:该方式仅对当前 shell 会话有效,需写入 ~/.bashrc 或 ~/.zshrc 才能持久化。
方法三:临时覆盖(调试用)
Echo框架 5.1.0 版本源码包下载,适合关注 RealIP 行为变化、StartConfig.Listener、NewDefaultFS 和观测性中间件入口的开发团队。
执行:GOPROXY=https://goproxy.cn,direct go mod download
这一步操作起来很简单,但仅本次命令生效,不改变全局配置。
私有模块必须绕过代理
第一步:识别私有模块域名
查看 go.mod 中所有非官方路径,例如 git.internal.company.com/libs/auth、github.com/myorg/private。
第二步:设置 GONOPROXY 和 GONOSUMDB
执行:go env -w GONOPROXY="git.internal.company.com,github.com/myorg"
紧接着执行:go env -w GONOSUMDB="git.internal.company.com,github.com/myorg"
【GONOPROXY 和 GONOSUMDB 值必须完全一致】 否则私有模块仍会被发往代理,导致 403 或 lookup failed。
第三步:验证私有模块是否跳过代理
运行:go list -m -f '{{.Dir}}' git.internal.company.com/libs/auth -x,输出中不应出现任何 goproxy.cn 请求 URL。










