使用 goproxy 搭建 Go 模块代理服务器

2025-04-10#Go

出于多种原因,在使用 Go 语言编写应用时,可能会遇到下载第三方模块很慢甚至无法下载的问题。为此,可自建一个 Go 模块的代理服务器,加速访问。

搭建 goproxy 服务器 🔗

前置条件 🔗

goproxy 在运行时,依赖来 gogit 可执行文件。因此,需要安装 Go 和 Git。

安装 Go 🔗

对于 Go, 可参考它的官网页面 《Download and install》,在服务器下载和安装 Go。以下是命令行的示例(按需修改版本号和平台):

wget -O /tmp/go.tar.gz https://go.dev/dl/go1.24.2.linux-amd64.tar.gz
rm -rf /usr/local/go && tar -C /usr/local -xzf /tmp/go.tar.gz
ln -s /usr/local/go/bin/go /usr/local/bin/go

安装 Git 🔗

在 Ubuntu 上,可使用 apt-get 安装:

apt-get install -y git-core

下载 goproxy 🔗

goproxy/goproxy 项目主页的 Releases 页面下载 goproxy 的可执行文件。将其加入到系统路径中(比如 /usr/local/bin 目录)。

运行 goproxy 🔗

运行 goproxy 的命令为:

goproxy server --address 127.0.0.1:8085 --cacher-dir /tmp/goproxy-cache --proxied-sumdbs "sum.golang.org"

注意:上面的命令设置了 --proxied-sumdbs ;如果不设置,那么 go 命令会使用默认的 https://sum.golang.org 作为 GOSUMDB,而访问这个地址可能也会遇到遇到下载第三方模块很慢甚至无法下载的问题。

创建 Systemd 服务文件 🔗

为了将 Goproxy 作为系统服务运行,可创建文件 /lib/systemd/system/goproxy.service 文件,内容如下:

[Unit]
Description=goproxy
After=network.target network-online.target
Requires=network-online.target

[Service]
Environment=GOMODCACHE=/tmp/goproxy-gomodcache
DynamicUser=true
ExecStart=/usr/local/bin/goproxy server --address 127.0.0.1:8085 --cacher-dir /tmp/goproxy-cache --proxied-sumdbs "sum.golang.org"
TimeoutStopSec=5s

[Install]
WantedBy=multi-user.target

此时启动服务,goproxy 启动后就会在 8085 端口监听请求,但从其他服务器是无法访问的。因为接下来要使用反向代理将服务暴露给外部。

服务器并配置HTTPS,将 goproxy 暴露给外部。

配置反向代理 🔗

使用 Nginx、Caddy 等工具可搭建反向代理服务器。为了配置站点的 SSL 证书,还需要配置好域名记录。以 Caddy 服务器为例,只需要添加如下配置:

replace-me-with-domain {
	reverse_proxy localhost:8085
}

其中 replace-me-with-domain 是外部访问服务器的域名。 Caddy 服务器会自动地申请和续订 SSL 证书。

使用 Go 模块代理服务器 🔗

设置 GOPROXY 环境变量 🔗

在使用 goproxy 服务器的开发机上,全局性地修改 GOPROXY 环境变量的值。如下所示(需将 replace-me-with-domain 替换为真实域名):

go env -w GOPROXY=https://replace-me-with-domain,direct

在 MacOS 上,以上命令将 GOPROXY 环境变量的值写入 ~/Library/Application\ Support/go/env 文件中。其内容可能如下:

GO111MODULE=on
GOPROXY=https://replace-me-with-domain,direct

下载模块 🔗

在配置好 GOPROXY 环境变量后,使用 go get 命令就会从自建的服务器中下载模块,并使用它校验模块。


加载中...