使用纯 JavaScript 部署你自己的速度测试,无需外部服务
你曾经遇到过这种情况吗?你的套餐显示千兆网络,文件下载很快,但工作通话或访问家庭服务器却慢得令人痛苦?你的第一反应是打开一个知名的测速网站,点击那个大大的圆形按钮。问题是,公共测试显示的是到提供商服务器的速度,而不是你本地网络、办公环境或个人云的实际吞吐量。
我发现了 OpenSpeedTest 项目的 Speed-Test 仓库。作者从 2011 年开始开发,至今已超过十年。这是一个完全使用纯 HTML5、CSS 和原生 JavaScript 编写的开源网络带宽测试工具。没有 React、Vue、臃肿的包或外部依赖。
技术内幕
源代码的主要亮点在于其优雅性。所有客户端逻辑都被压缩到 gzipped 脚本中,文件大小在 8 KB 以下。界面完全使用矢量 SVG 渲染,因此在老旧显示器和 4K 智能手机屏幕上都能呈现同样清晰的显示效果。
为了让工具正常工作,客户端只需要一个支持 XMLHttpRequest(XHR2)的浏览器即可。即使是古老的 Internet Explorer 10 也能满足要求。在服务器端,只需通过任何 Web 服务器提供静态文件即可:Nginx、Apache、Caddy 或 Express。
没有隐藏的后端脚本或复杂的二进制文件,因此攻击面极小。从本质上讲,你只是向浏览器提供一组静态文件,之后客户端开始发送一系列指定大小的并行 POST 和 GET 请求。
通过 URL 参数管理测试
作者没有构建繁琐的设置菜单,而是选择通过地址栏中的 GET 参数来控制测试。如果你希望给同事一个预配置好行为的现成链接,这种方式非常方便。
以下是一些有用的参数:
- 页面打开时自动开始测试:
http://192.168.1.5?Run
- 对网络进行压力测试。你可以设置预设或指定测试持续时间(秒)。例如,在两个方向上运行流量 300 秒:
http://192.168.1.5?Stress=300
或者使用更简短的语法:
http://192.168.1.5?S=L
- 限制并行 HTTP 流的数量(默认值为 6,最大值为 32):
http://192.168.1.5?XHR=4
- 运行特定阶段,例如仅上传或延迟检查:
http://192.168.1.5?Test=Upload
如果你想从办公机器集群中收集统计数据,可以在 index.html 文件中取消注释 saveData 变量并指定你的数据库 webhook 地址:
var saveData = true;
var saveDataURL = "//metrics.internal.lan/save?data=";
如何自行运行
部署你自己的速度测试最快的方式是使用现成的 Docker 镜像。它基于轻量级的 Alpine 构建,使用非 root Nginx 用户:
docker run -d \
--name openspeedtest \
--restart=unless-stopped \
-p 3000:3000 \
-p 3001:3001 \
openspeedtest/latest
如果你更喜欢使用 compose,配置看起来很简洁:
version: '3.3'
services:
speedtest:
container_name: openspeedtest
image: openspeedtest/latest
restart: unless-stopped
ports:
- '3000:3000'
- '3001:3001'
启动后,界面将在 http://IP_СЕРВЕРА:3000 可用。
如果你在自己的反向代理后面安装服务,请务必将请求体大小限制 client_max_body_size 增加到至少 35 MB。否则,上传测试将开始因 413 错误而失败。
顺便说一下,如果你计划测试超过 1 Gbps 的速度,作者建议使用 Linux 主机。在 macOS 或 Windows 的 Docker Desktop 上,速度通常会因为虚拟化和网络桥接的开销而达到上限。
为什么要保留本地速度测试
在几种场景下,常规的 Web 服务是无用的:
- 诊断 Wi-Fi 和中继器。 当你在家里或办公室安装信号中继器时,速度平均会下降一半。从不同房间在本地测试连接可以让你精确定位接入点的最佳位置,而不受外部互联网连接波动的影响。
- 检查浏览器扩展的影响。 有时像 iperf 这样的工具显示的是真实的千兆速度,但网页打开却很慢。在你的正常配置文件中运行 OpenSpeedTest,然后在隐私窗口中运行。结果的差异将显示你安装的插件正在消耗多少毫秒。
- 评估到远程办公室的通道。 当远程员工抱怨访问文件存储速度慢时,服务器上的本地容器将显示真实的隧道速度。
值得一试吗
Speed-Test 解决了一个特定问题,没有广告、第三方遥测或臃肿的依赖。如果你需要定期配置本地网络、找出故障的网线或检查家庭 NAS 的性能,请将这个镜像备用。它在一分钟内就能部署完成,消耗资源极少,却能带来巨大的价值。
相关项目











