Speedtest进阶:结合Prometheus长期监控局域网速率

张开发
2026/4/8 4:39:02 15 分钟阅读

分享文章

Speedtest进阶:结合Prometheus长期监控局域网速率
在完成Speedtest基础部署与核心配置后很多运维人员、IT爱好者会遇到新的需求如何长期监控局域网速率变化企业多网段场景下如何实现精准测速低配置设备如老旧服务器、小型NAS如何轻量化部署本文将基于Speedtest基础部署聚焦三大进阶场景——速率监控可视化PrometheusGrafana、企业多网段适配多服务端部署、轻量部署静态版Nginx部署结合实操命令、配置细节和避坑指南帮你把Speedtest的实用性拉满覆盖从个人家庭到企业内网的全场景测速需求适合有进阶需求的技术从业者参考。特别说明常规的PrometheusGrafana监控方案仅能采集Speedtest服务端的速率数据无法区分终端设备如办公电脑、手机的无线/有线速率差异本文新增终端自动标识脚本无需用户手动输入设备信息即可自动采集终端设备名称、网络类型实现终端级差异化测速监控。一、前言为什么需要Speedtest进阶用法基础玩法请查阅我的这篇文章局域网测速神器Speedtest一键部署指南https://blog.csdn.net/qq_31766615/article/details/159919902?fromshareblogdetailsharetypeblogdetailsharerId159919902sharereferPCsharesourceqq_31766615sharefromfrom_link此前我们已经讲解了Docker部署Speedtest、自定义局域网IP、中文汉化等基础操作能满足日常单次测速需求。但在实际使用中不同场景会有更细分的需求运维场景需要长期监控局域网速率及时发现带宽波动、网络瓶颈而非单次手动测速企业场景内网存在多个网段如办公网段、服务器网段、监控网段单台Speedtest服务端无法覆盖全网段测速轻量场景老旧服务器、小型NAS资源有限DockerPHP的部署方式占用资源较高需要更轻量的方案终端差异化场景需区分终端设备的无线WiFi、有线网线速率排查终端侧测速异常且希望无需手动输入设备信息提升操作效率。针对以上需求本文将逐一给出可落地的进阶方案所有操作均基于开源SpeedtestLibreSpeed原adolfintel开源版参考其GitHub官方文档https://github.com/adolfintel/speedtest结合官方文档和实际部署经验确保步骤可复现、无冗余重点新增终端自动标识脚本解决手动输入的繁琐问题。二、进阶方案一PrometheusGrafana实现速率监控可视化对于需要长期监控局域网速率的场景仅靠手动测速无法及时发现网络异常。结合Prometheus数据采集Grafana可视化面板可将Speedtest的测速数据实时采集、存储并可视化支持设置告警轻松掌握局域网速率变化趋势。新增终端自动标识脚本实现设备名称、网络类型自动采集无需手动输入。2.1 前置准备已完成Speedtest基础部署Docker版或静态版均可且服务器已安装Docker用于部署Prometheus和Grafana若未安装参考文末附录。核心思路通过Speedtest导出测速数据结合终端自动标识脚本采集设备信息Prometheus定时采集数据Grafana配置面板展示数据。2.2 步骤1配置Speedtest数据导出Speedtest开源版LibreSpeed支持将测速结果导出为JSON格式便于Prometheus采集参考官方文档LibreSpeed原生支持数据导出功能。基于之前的Docker数据卷挂载方案修改配置实现数据导出# 1. 进入宿主机Speedtest配置目录基于之前的挂载路径 cd /home/admin/speedtest/backend # 2. 编辑config.php文件开启数据导出功能 vim config.php核心配置修改添加以下内容放在文件末尾// 开启JSON数据导出LibreSpeed原生支持参考官方配置 $enableJsonExport true; // 导出文件路径建议放在挂载目录下便于Prometheus访问 $jsonExportPath /var/www/html/results/speedtest_results.json; // 测速数据保留时间单位秒此处设置7天可根据需求调整 $jsonExportRetention 604800; // 允许接收终端标识参数设备名称、网络类型用于自动标识脚本提交数据 $allowTerminalParams true;修改完成后重启Speedtest容器docker restart speedtest。此时每次完成测速后数据会自动写入/home/admin/speedtest/html/results/speedtest_results.json宿主机路径格式包含下载速率、上传速率、延迟、测试时间等关键信息。2.3 步骤2部署终端自动标识脚本核心新增终端自动标识脚本支持Windows、macOS、Linux三大系统可自动获取终端设备名称、网络连接类型有线/无线并自动提交到Speedtest服务端无需用户手动输入。脚本基于系统原生命令编写无需额外安装依赖可直接运行。2.3.1 Windows系统自动标识脚本bat格式新建speedtest_auto_identify.bat文件复制以下代码保存到终端桌面双击运行即可自动完成测速自动提交设备名称、网络类型echo off :: 自动获取设备名称Windows系统 for /f tokens2 delims %%a in (wmic computersystem get name /value) do set deviceName%%a :: 自动获取网络连接类型有线/无线 for /f tokens2 delims: %%a in (netsh interface show interface ^| findstr /i 已连接) do set netInterface%%a :: 判断网络类型包含WiFi则为无线否则为有线 echo %netInterface% | findstr /i WiFi nul if %errorlevel% equ 0 ( set netTypewireless ) else ( set netTypewired ) :: 提交数据到Speedtest服务端替换为你的Speedtest服务端IP curl -X POST http://宿主机局域网IP:8099/backend/speedtest_worker.php -H Content-Type: application/json -d {\deviceName\:\%deviceName%\,\netType\:\%netType%\} :: 自动打开Speedtest页面开始测速可选 start http://宿主机局域网IP:8099 echo 终端标识已自动提交测速页面已打开 pause说明脚本通过wmic命令获取设备名称通过netsh命令获取网络接口信息自动判断有线/无线适配Windows 10/11所有版本无需额外配置。2.3.2 macOS系统自动标识脚本shell格式新建speedtest_auto_identify.sh文件复制以下代码赋予执行权限并运行自动提交设备信息并打开测速页面#!/bin/bash # 自动获取设备名称macOS系统 deviceName$(scutil --get ComputerName) # 自动获取网络连接类型有线/无线 # 查看当前活跃网络接口排除lo0本地回环 activeInterface$(netstat -rn | grep default | awk {print $6} | head -n 1) # 判断网络类型en0通常为无线en1/en2通常为有线可根据实际情况调整 if [[ $activeInterface en0 ]]; then netTypewireless else netTypewired fi # 提交数据到Speedtest服务端替换为你的Speedtest服务端IP curl -X POST http://宿主机局域网IP:8099/backend/speedtest_worker.php -H Content-Type: application/json -d {\deviceName\:\$deviceName\,\netType\:\$netType\} # 自动打开Speedtest页面开始测速可选 open http://宿主机局域网IP:8099 echo 终端标识已自动提交测速页面已打开赋予执行权限命令chmod x speedtest_auto_identify.sh运行命令./speedtest_auto_identify.sh适配所有macOS版本。2.3.3 Linux系统自动标识脚本shell格式新建speedtest_auto_identify.sh文件复制以下代码赋予执行权限并运行适配Ubuntu、CentOS等主流Linux发行版#!/bin/bash # 自动获取设备名称Linux系统 deviceName$(hostname) # 自动获取网络连接类型有线/无线 # 查看所有网络接口排除lo本地回环获取活跃接口 activeInterface$(ip link show | grep -v lo | grep UP | awk {print $2} | sed s/:// | head -n 1) # 判断网络类型wlan开头为无线eth/en开头为有线 if [[ $activeInterface wlan* ]]; then netTypewireless else netTypewired fi # 提交数据到Speedtest服务端替换为你的Speedtest服务端IP curl -X POST http://宿主机局域网IP:8099/backend/speedtest_worker.php -H Content-Type: application/json -d {\deviceName\:\$deviceName\,\netType\:\$netType\} # 自动打开Speedtest页面开始测速可选需安装浏览器 xdg-open http://宿主机局域网IP:8099 echo 终端标识已自动提交测速页面已打开2.3.4 脚本优化与注意事项服务端IP替换所有脚本中的宿主机局域网IP需替换为你的Speedtest服务端实际局域网IP如192.168.1.100避免提交失败网络接口适配若部分设备网络接口命名特殊如macOS的en3、Linux的eth1可通过netstatmacOS/Linux、netshWindows命令查看实际活跃接口调整脚本中的判断条件批量部署企业场景可将脚本批量推送至所有终端通过Ansible、域控制器等工具设置开机自启实现终端测速自动化、标识自动化兼容性脚本基于系统原生命令编写无需额外安装依赖适配LibreSpeed最新版本参考GitHub官方更新脚本兼容v5.5.1及以上版本。2.4 步骤3修改Speedtest后端接收自动标识数据编辑Speedtest后端getIP.php文件添加终端标识接收逻辑确保脚本提交的设备名称、网络类型能正确存储并关联测速数据# 进入宿主机Speedtest后端配置目录 cd /home/admin/speedtest/backend # 编辑getIP.php文件 vim getIP.php核心修改在getIP()函数之后添加以下代码// 新增接收终端自动标识脚本提交的设备名称和网络类型 function getTerminalInfo() { // 接收POST请求中的终端标识参数 $rawData file_get_contents(php://input); $data json_decode($rawData, true); // 若未接收到参数如手动测速设置默认值 $deviceName $data[deviceName] ?? 未知设备; $netType $data[netType] ?? 未知类型; return [ device_name $deviceName, net_type $netType ]; } // 调用函数获取终端标识信息 $terminalInfo getTerminalInfo(); // 将终端标识加入测速结果与速率数据绑定 $testResult[device_name] $terminalInfo[device_name]; $testResult[net_type] $terminalInfo[net_type];修改完成后重启Speedtest容器docker restart speedtest此时终端运行自动标识脚本后设备名称、网络类型会自动提交到服务端并与测速数据一起写入JSON文件。2.5 步骤4部署Prometheus数据采集使用Docker部署Prometheus核心是配置数据采集规则定时抓取Speedtest导出的JSON数据同时提取终端标识标签设备名称、网络类型实现“终端-速率”关联。# 1. 创建Prometheus配置目录 mkdir -p /home/admin/prometheus/config # 2. 编辑Prometheus配置文件 vim /home/admin/prometheus/config/prometheus.yml配置文件内容重点添加终端标识标签提取规则global: scrape_interval: 60s # 采集间隔1分钟可调整 evaluation_interval: 60s scrape_configs: # Speedtest数据采集新增终端标识标签提取 - job_name: speedtest static_configs: - targets: [宿主机局域网IP:8099] # Speedtest服务地址 metrics_path: /results/speedtest_results.json # 数据导出路径 scrape_interval: 300s # 5分钟采集一次避免频繁采集占用资源 params: format: [json] relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: 宿主机局域网IP:8099 # 替换为Speedtest服务地址 # 提取JSON中的终端标识作为标签关键优化关联设备名称和网络类型 json_parse: - source_labels: [__body__] target_label: device_name json_path: $.device_name - source_labels: [__body__] target_label: net_type json_path: $.net_type - source_labels: [__body__] target_label: download_speed json_path: $.download - source_labels: [__body__] target_label: upload_speed json_path: $.upload启动Prometheus容器docker run -d --name prometheus --restartalways \ -p 9090:9090 \ -v /home/admin/prometheus/config:/etc/prometheus \ -v /home/admin/prometheus/data:/prometheus \ prom/prometheus:latest部署验证访问http://宿主机局域网IP:9090进入Prometheus界面点击“Status”→“Targets”若“speedtest”状态为“UP”再点击“Graph”输入“download_speed”可看到携带“device_name”“net_type”标签的数据说明终端自动标识数据采集成功。2.6 步骤5部署Grafana可视化面板Grafana用于将Prometheus采集的数据可视化重点配置面板实现按“网络类型”无线/有线、“设备名称”筛选数据清晰区分不同终端的速率差异。# 1. 启动Grafana容器 docker run -d --name grafana --restartalways \ -p 3000:3000 \ -v /home/admin/grafana/data:/var/lib/grafana \ grafana/grafana:latest初始化配置访问http://宿主机局域网IP:3000默认账号密码admin/admin首次登录需修改密码添加数据源点击“Configuration”→“Data Sources”→“Add data source”选择“Prometheus”输入Prometheus地址http://宿主机局域网IP:9090点击“Save Test”提示“Data source is working”即为成功导入并优化Speedtest可视化面板点击“Dashboards”→“Import”输入面板ID推荐8939适配Speedtest数据可在Grafana官网搜索“Speedtest”获取选择已添加的Prometheus数据源点击“Import”面板优化点击面板右上角“Settings”→“Variables”添加两个变量——①“net_type”变量类型Query数据源Prometheus查询语句label_values(net_type)②“device_name”变量类型Query查询语句label_values(device_name)添加筛选控件在面板顶部添加“网络类型”“设备名称”下拉筛选框用户可自由选择查看无线/有线、特定设备的速率数据实现终端级差异化监控。优化建议可自定义面板布局添加下载速率、上传速率、延迟等关键指标的趋势图设置告警阈值如下载速率低于100Mbps时触发告警便于及时发现网络异常。三、进阶方案二多服务端部署适配企业多网段测速企业内网通常分为多个网段如192.168.1.0/24办公网段、192.168.2.0/24服务器网段、192.168.3.0/24监控网段单台Speedtest服务端可能因路由限制无法被所有网段访问导致测速失败。此时多服务端部署是最优解决方案每个网段部署一台Speedtest服务端实现全网段覆盖同时可复用上述终端自动标识脚本实现多网段、多终端的自动化测速。3.1 部署规划以3个网段为例网段Speedtest服务端IP映射端口部署设备192.168.1.0/24办公网段192.168.1.1008099办公区服务器192.168.2.0/24服务器网段192.168.2.1008099应用服务器192.168.3.0/24监控网段192.168.3.1008099监控服务器3.2 实操部署单网段部署步骤多网段重复执行基于Docker数据卷挂载方案每个网段的Speedtest服务端部署步骤如下以192.168.1.0/24网段为例同时集成终端自动标识相关配置# 1. 创建挂载目录 mkdir -p /home/admin/speedtest/backend /home/admin/speedtest/html # 2. 启动容器注意修改宿主机IP适配当前网段 sudo docker run -p 8099:80 -d --name speedtest --restartalways \ -e DISABLE_IPINFOtrue -e ENABLE_ID_OBFUSCATIONtrue \ -v /home/admin/speedtest/html:/var/www/html \ -v /home/admin/speedtest/backend:/var/www/html/backend \ --rm swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/adolfintel/speedtest:latest # 3. 复制已配置好的终端自动标识相关文件config.php、getIP.php # 可从已配置好的服务器复制避免重复编辑 scp 192.168.1.100:/home/admin/speedtest/backend/config.php /home/admin/speedtest/backend/ scp 192.168.1.100:/home/admin/speedtest/backend/getIP.php /home/admin/speedtest/backend/ # 4. 配置自定义IP段适配当前网段以192.168.1.0/24为例 vim /home/admin/speedtest/backend/getIP.php修改getIP.php中的IP判断逻辑添加当前网段if (strpos($ip, 192.168.) 0 || strpos($ip, 172.16.) 0 || strpos($ip, 10.) 0) { return $ip; // 覆盖所有企业内网网段 }重启容器docker restart speedtest完成单网段部署。其他网段重复上述步骤仅需修改宿主机IP和getIP.php中的网段配置即可。终端自动标识脚本可批量推送至各网段终端修改脚本中的服务端IP为对应网段的Speedtest服务端IP即可。3.3 优化统一管理多服务端多服务端部署后可通过以下方式实现统一管理提升运维效率统一中文汉化将一个网段的index.php、style.css等汉化文件复制到其他网段的挂载目录实现所有服务端界面统一统一配置同步使用Ansible工具批量推送配置文件getIP.php、config.php和终端自动标识脚本避免手动逐个修改统一监控将所有Speedtest服务端的数据源添加到同一个Grafana面板新增“网段”变量实现按网段、终端类型、设备名称的多维度筛选。四、进阶方案三静态版部署Nginx实现轻量无依赖此前的DockerPHP部署方式虽然便捷但会占用一定的服务器资源约50-100MB内存。对于老旧服务器、小型NAS如群晖DS218等资源有限的设备推荐使用静态版Speedtest部署无需PHP后端仅需Nginx服务资源占用可降低至10MB以下且部署更简单。补充说明静态版Speedtest基于HTMLJavaScript实现参考LibreSpeed官方静态文件index.html、speedtest.js等无需后端处理仅支持基础的下载/上传速率测试不支持数据导出、终端自动标识等功能适合轻量测速场景如家庭内网、小型办公网络。4.1 前置准备服务器已安装Nginx若未安装参考文末附录且已下载Speedtest静态版源码可从GitHub获取地址https://github.com/adolfintel/speedtest下载最新版本提取静态文件index.html、speedtest.js、speedtest_worker.js、favicon.ico。4.2 实操部署步骤# 1. 下载Speedtest源码也可手动从GitHub下载后上传 wget https://github.com/adolfintel/speedtest/archive/refs/heads/master.zip -O speedtest-master.zip # 2. 解压源码提取静态文件 unzip speedtest-master.zip cd speedtest-master # 3. 创建Nginx网站目录 mkdir -p /var/www/speedtest # 4. 复制静态文件到Nginx目录仅保留静态文件删除backend等后端目录 cp index.html speedtest.js speedtest_worker.js favicon.ico /var/www/speedtest/ # 5. 编辑Nginx配置文件 vim /etc/nginx/conf.d/speedtest.confNginx配置文件内容server { listen 8099; # 映射端口可自定义 server_name localhost; root /var/www/speedtest; index index.html; # 解决跨域问题可选若测速异常可添加 add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods GET,POST,OPTIONS; location / { try_files $uri $uri/ /index.html; } }启动并重启Nginx# 启动Nginx若已启动执行重启命令 sudo systemctl start nginx sudo systemctl enable nginx # 重启Nginx使配置生效 sudo systemctl restart nginx部署验证访问http://宿主机局域网IP:8099即可看到Speedtest静态版页面点击“开始测速”即可完成基础的速率测试。4.3 优化静态版中文汉化与适配静态版汉化方法与Docker版一致直接编辑/var/www/speedtest/index.html文件替换页面标题、按钮、提示文字等内容参考基础配置中的中文汉化步骤。同时可修改speedtest.js中的测速参数如测速时长优化测速体验// 找到测速时长配置默认10秒修改为20秒 const testDuration 20; // 找到速率单位配置补充中文提示 const unitText { Mbps: Mbps兆比特/秒, Kbps: Kbps千比特/秒 };五、常见问题排查进阶版避坑指南5.1 Prometheus采集Speedtest数据失败原因1. Speedtest数据导出路径配置错误2. Prometheus配置文件中的targets地址错误3. 防火墙未开放9090端口4. 终端自动标识脚本提交参数错误。解决方案1. 检查config.php中的jsonExportPath路径确保与Prometheus配置一致2. 核对Prometheus配置中的宿主机IP和端口3. 开放9090端口firewall-cmd --add-port9090/tcp --permanent4. 检查脚本中的服务端IP是否正确运行脚本查看是否有报错。5.4 终端自动标识脚本运行失败原因1. 脚本中的服务端IP未替换为实际地址2. 系统命令缺失如Windows的wmic、Linux的ip命令3. 终端防火墙拦截脚本提交请求。解决方案1. 替换脚本中的“宿主机局域网IP”为实际Speedtest服务端IP2. 检查系统命令是否正常如Windows运行wmic computersystem get nameLinux运行ip link show3. 临时关闭终端防火墙测试脚本是否能正常提交数据如需长期运行添加防火墙放行规则。5.5 Grafana面板无法区分终端无线/有线速率原因1. Prometheus未正确提取net_type标签2. Grafana变量配置错误3. 终端自动标识脚本未正确提交网络类型参数。解决方案1. 检查Prometheus配置中的json_parse规则确保net_type标签正确提取2. 核对Grafana变量配置确保net_type变量关联正确的标签3. 运行终端脚本查看是否成功提交net_type参数。5.2 多服务端部署后跨网段无法访问原因企业内网路由未配置跨网段访问或防火墙限制了8099端口。解决方案1. 联系网络管理员配置跨网段路由允许各网段之间的通信2. 在每个服务端的宿主机上开放8099端口确保跨网段终端能访问。5.3 静态版Speedtest测速无结果原因1. Nginx配置错误未正确指向静态文件2. speedtest.js文件路径错误3. 浏览器缓存导致。解决方案1. 检查Nginx配置中的root路径确保指向/var/www/speedtest2. 核对index.html中引用的speedtest.js路径是否正确3. 清除浏览器缓存重新访问页面。六、总结与拓展本文围绕Speedtest的三大进阶用法新增终端自动标识脚本适配Windows/macOS/Linux解决了“手动输入设备信息繁琐”“无法区分终端无线/有线速率”的核心痛点详细讲解了监控可视化、多网段适配、轻量部署的实操步骤覆盖了从运维监控到企业内网、轻量场景的全需求。所有方案均基于LibreSpeed原adolfintel/speedtest开源项目结合官方文档优化确保步骤可复现。拓展建议1. 静态版Speedtest可结合Nginx反向代理配置HTTPS提升访问安全性2. 多服务端场景可结合DNS解析为每个服务端配置自定义域名如speedtest-office.example.com便于终端用户记忆3. 若需要更复杂的监控需求可结合Alertmanager实现速率异常时的邮件、短信告警4. 终端自动标识脚本可进一步优化结合企业内网DHCP服务器自动关联终端IP、设备名称和网络类型实现全自动化采集。附录相关工具与资源Docker快速安装命令Ubuntu/CentOS# Ubuntusudo apt update sudo apt install docker.io -ysudo systemctl start docker sudo systemctl enable docker# CentOSsudo yum install docker -ysudo systemctl start docker sudo systemctl enable dockerNginx快速安装命令# Ubuntusudo apt install nginx -ysudo systemctl start nginx sudo systemctl enable nginx# CentOSsudo yum install nginx -ysudo systemctl start nginx sudo systemctl enable nginxSpeedtest开源版LibreSpeedGitHub地址https://github.com/adolfintel/speedtest可获取静态版源码、最新配置说明、版本更新日志Grafana Speedtest面板ID13053https://grafana.com/grafana/dashboards/13053-speedtest/Ansible批量管理教程参考Ansible官方文档适合多服务端配置同步和终端脚本批量推送终端自动标识脚本备份可将本文中的脚本保存至GitHub或企业内网文件服务器便于后续批量部署和更新。如果在进阶部署过程中遇到其他问题欢迎在评论区留言交流后续会持续更新优化方案助力大家高效运用Speedtest实现各类局域网测速需求

更多文章