>_ DevTrendszh

语言

首页

语言

板块

前端 后端 移动端 DevOps AI / ML 游戏开发 区块链 嵌入式 安全
JavaScript

使用纯 JavaScript 部署你自己的速度测试,无需外部服务

你曾经遇到过这种情况吗?你的套餐显示千兆网络,文件下载很快,但工作通话或访问家庭服务器却慢得令人痛苦?你的第一反应是打开一个知名的测速网站,点击那个大大的圆形按钮。问题是,公共测试显示的是到提供商服务器的速度,而不是你本地网络、办公环境或个人云的实际吞吐量。

Download OpenSpeedTest-Server V2.1

我发现了 OpenSpeedTest 项目的 Speed-Test 仓库。作者从 2011 年开始开发,至今已超过十年。这是一个完全使用纯 HTML5、CSS 和原生 JavaScript 编写的开源网络带宽测试工具。没有 React、Vue、臃肿的包或外部依赖。

Download from the Microsoft Store Download from the Mac App Store Download from the App Store Download from the Google Play Store Download from the Snap Store Download from the Docker Hub Download from the Helm Store Download from GitHub

技术内幕

源代码的主要亮点在于其优雅性。所有客户端逻辑都被压缩到 gzipped 脚本中,文件大小在 8 KB 以下。界面完全使用矢量 SVG 渲染,因此在老旧显示器和 4K 智能手机屏幕上都能呈现同样清晰的显示效果。

为了让工具正常工作,客户端只需要一个支持 XMLHttpRequest(XHR2)的浏览器即可。即使是古老的 Internet Explorer 10 也能满足要求。在服务器端,只需通过任何 Web 服务器提供静态文件即可:Nginx、Apache、Caddy 或 Express。

没有隐藏的后端脚本或复杂的二进制文件,因此攻击面极小。从本质上讲,你只是向浏览器提供一组静态文件,之后客户端开始发送一系列指定大小的并行 POST 和 GET 请求。

Video Tutorial by Roberto Jorge Tech Video Tutorial by LanPad

通过 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 可用。

Download OpenSpeedTest-Server V2.1

如果你在自己的反向代理后面安装服务,请务必将请求体大小限制 client_max_body_size 增加到至少 35 MB。否则,上传测试将开始因 413 错误而失败。

顺便说一下,如果你计划测试超过 1 Gbps 的速度,作者建议使用 Linux 主机。在 macOS 或 Windows 的 Docker Desktop 上,速度通常会因为虚拟化和网络桥接的开销而达到上限。

为什么要保留本地速度测试

在几种场景下,常规的 Web 服务是无用的:

  1. 诊断 Wi-Fi 和中继器。 当你在家里或办公室安装信号中继器时,速度平均会下降一半。从不同房间在本地测试连接可以让你精确定位接入点的最佳位置,而不受外部互联网连接波动的影响。
  2. 检查浏览器扩展的影响。 有时像 iperf 这样的工具显示的是真实的千兆速度,但网页打开却很慢。在你的正常配置文件中运行 OpenSpeedTest,然后在隐私窗口中运行。结果的差异将显示你安装的插件正在消耗多少毫秒。
  3. 评估到远程办公室的通道。 当远程员工抱怨访问文件存储速度慢时,服务器上的本地容器将显示真实的隧道速度。

值得一试吗

Speed-Test 解决了一个特定问题,没有广告、第三方遥测或臃肿的依赖。如果你需要定期配置本地网络、找出故障的网线或检查家庭 NAS 的性能,请将这个镜像备用。它在一分钟内就能部署完成,消耗资源极少,却能带来巨大的价值。

相关项目