LibreSpeed 的 Go 后端内置 Web 界面,提供测量下载、上传和延迟的 HTTP 接口。本文用 systemd 在 Debian 上以非 root 身份运行后端,由同一台主机上的 Caddy 提供公网 HTTPS 入口。
安装 Debian 预编译二进制
本文固定使用 LibreSpeed speedtest-go v1.1.6,命令适用于 Debian amd64 和 arm64。发布包中的 speedtest-backend 已内置默认前端资源。其他架构可查看官方发布页。
sudo apt update
sudo apt install curl ca-certificates
(
set -eu
version=1.1.6
arch=$(dpkg --print-architecture)
case "$arch" in
amd64|arm64) ;;
*) printf 'Select a release archive for %s\n' "$arch" >&2; exit 1 ;;
esac
archive="speedtest-go_${version}_linux_${arch}.tar.gz"
release="https://github.com/librespeed/speedtest-go/releases/download/v${version}"
workdir=$(mktemp -d)
trap 'rm -rf -- "$workdir"' EXIT
cd "$workdir"
curl -fsSL -o "$archive" "$release/$archive"
curl -fsSL -o checksums.txt "$release/checksums.txt"
awk -v file="$archive" '$2 == file || $2 == "*" file' checksums.txt > archive.sha256
sha256sum -c archive.sha256
tar -xzf "$archive"
sudo install -d -m 0755 /usr/local/bin
sudo install -m 0755 speedtest-backend /usr/local/bin/speedtest-backend
)
配置 systemd 服务
后端监听本机回环地址,由 Caddy 终止 TLS。database_type = "none" 关闭测速结果和统计记录。参见上游的 TOML 示例和 systemd unit。
sudo install -d -m 0755 /etc/speedtest-go
sudo tee /etc/speedtest-go/settings.toml >/dev/null <<'EOF'
bind_address = "127.0.0.1"
listen_port = 8989
proxyprotocol_port = 0
enable_tls = false
enable_http2 = false
database_type = "none"
EOF
sudo tee /etc/systemd/system/speedtest-go.service >/dev/null <<'EOF'
[Unit]
Description=LibreSpeed Go backend
After=network.target
[Service]
ExecStart=/usr/local/bin/speedtest-backend -c /etc/speedtest-go/settings.toml
DynamicUser=yes
Restart=on-failure
RestartSec=3s
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now speedtest-go.service
systemctl is-active speedtest-go.service
ss -ltn 'sport = :8989'
curl -fsS -o /dev/null -w 'HTTP %{http_code}\n' http://127.0.0.1:8989/
预期看到服务状态为 active、监听地址为 127.0.0.1:8989,且请求返回 HTTP 200。如果启动失败,运行 sudo journalctl -u speedtest-go.service -n 50 --no-pager 查看日志。
用 Caddy 提供公网 HTTPS
将 speedtest.example.com 替换为你的公网域名,并将 DNS 记录指向 Caddy。使用默认 ACME 配置直接对公网提供服务时,确保 TCP 80 和 443 端口可达。如果要测客户端直达源站的线路,将测速域名设为 DNS only。开启 CDN 代理后,测速会包含 CDN 边缘和回源链路。参见 Caddy Automatic HTTPS 和 Cloudflare 代理状态。
speedtest.example.com {
reverse_proxy 127.0.0.1:8989
}
如果 Caddy 和后端分属两台主机,把后端绑定到 Caddy 可达的私网或 WireGuard 地址,修改 reverse_proxy 的 upstream,并在防火墙上只允许 Caddy 主机访问 8989/tcp。如果公网测速站仅供自己使用,将现有访问控制应用到整个站点,覆盖上传和下载接口。
sudo caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile
sudo systemctl reload caddy
在要测速的网络上打开 https://speedtest.example.com/index-classic.html,运行一次完整测速。
用 CLI 测速
在 Debian 13 上运行 sudo apt install librespeed-cli。在已安装 Homebrew 的 macOS 上,依次运行 brew tap librespeed/tap 和 brew install librespeed-cli。CLI 官方发布页也提供预编译包,Intel Mac 选 darwin_amd64,Apple 芯片机型选 darwin_arm64。参见 Debian 软件包和 LibreSpeed Homebrew tap。
cat > librespeed-servers.json <<'EOF'
[
{
"id": 1,
"name": "Self-hosted LibreSpeed",
"server": "https://speedtest.example.com/",
"dlURL": "garbage",
"ulURL": "empty",
"pingURL": "empty",
"getIpURL": "getIP"
}
]
EOF
librespeed-cli --local-json ./librespeed-servers.json --server 1 --no-icmp
--no-icmp 让延迟测试也走同一个公网 HTTP 入口。如果域名同时支持 IPv4 和 IPv6,可分别加上 -4 和 -6 做对照。参见 CLI 选项和自定义服务器格式。
对比 SSH 隧道、源站直连和公网域名
通过 SSH 本地端口转发,可以从客户端访问后端,测得的是经过 SSH 隧道的吞吐。在另一个终端保持以下命令运行。
ssh -N -o ExitOnForwardFailure=yes \
-L 18989:127.0.0.1:8989 user@debian.example.com
在同一台客户端上,对每条路径发起一次相同的下载请求。把 203.0.113.10 换成 Caddy 的公网 IPv4 地址。--resolve 指定连接地址,同时保留用于 TLS 和 HTTP 路由的域名。Go 后端收到 ckSize=16 时会返回 16 MiB 数据。参见后端实现和 curl 手册。
host=speedtest.example.com
origin=203.0.113.10
path='/garbage?ckSize=16'
probe_download() {
curl -q --noproxy '*' --http1.1 -fsS \
--connect-timeout 5 --max-time 45 -o /dev/null \
-w 'ip=%{remote_ip} http=%{http_version} status=%{http_code} bytes=%{size_download} avg=%{speed_download} B/s\n' \
"$@"
}
probe_download "http://127.0.0.1:18989$path"
probe_download --resolve "$host:443:$origin" "https://$host$path"
probe_download "https://$host$path"
只比较状态码为 200 且下载了 16777216 字节的完整响应。将 B/s 乘以 8 再除以 100 万,即得到 Mbps。如果只有按公网域名正常解析时速度偏慢,查看输出的 IP,确认是否经过 CDN 或使用了不同的 IP 协议栈。--noproxy '*' 会绕过 curl 配置的显式代理,系统级 TUN 仍可能影响路由。
我的实测中,SSH 隧道下载约为 151 Mbps,直连 Caddy 的 HTTP/1.1 下载约为 162 Mbps。Chrome 从 HTTP/3 切到 HTTP/2 后,网页测速有改善。后来发现先前认为 SSH 持续更快,是因为对照测试有误。测试时观察到 HTTP/3 偏慢,具体原因尚未定位。
复测浏览器时,在同一网络上打开同一个 /index-classic.html,在 DevTools 的 Network 面板检查下载请求的 Protocol 和 Remote Address。如果协议为 h3,临时禁用浏览器的 QUIC,重启后确认请求使用 h2 再测速。测完恢复浏览器设置。每次对照保持同一个测速入口、客户端网络和测速方向。