Giter VIP home page Giter VIP logo

speedtest-x's People

Contributors

amefs avatar badapple9 avatar hujk avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

speedtest-x's Issues

同IP多条记录的问题

测试发现,如果想同IP记录多条测速结果,那么下次测速开始前必须刷新页面后再测速才能记录到新的测速结果,如果不刷新页面就再次测速则永远只记录最近一次的测速结果(测速记录只有一条)。请问这是属于bug还是就这样设计的?

测速数据库没有数据

如图...
image

使用的docker镜像是 stilleshan/speedtest-x,没有开映射文件什么的。。
环境变量配置:

    environment: #设置容器内的环境变量 会覆盖镜像中的环境变量
      - WEBPORT=10090 #最大可保存多少条测速记录
      - MAX_LOG_COUNT=100 #最大可保存多少条测速记录
      - IP_SERVICE=ip.sb #使用的 IP 运营商解析服务(ip.sb 或 ipinfo.io)
      - SAME_IP_MULTI_LOGS=true #是否允许同一IP记录多条测速结果
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Shanghai

DD萌咖debian9系统,安装锐速后,部署docker版运行不正常

大佬,问题RT。不正常的表现为2点:
1、点击Start开始,出现“假死”,得等上1分来钟,才开始显示IP,跑测速;
2、IP运营商不能正常获取,显示 Unknown。

——以上我在6、7台小鸡上部署,都出现了这种问题。对了,我用的系统是DD的debian 9。

经过一步步测试发现:
1、主机商原Debian9系统不改内核:Start反应很快,IP识别正常
2、部分主机商原Debian9系统换锐速内核:Start反应很快,IP识别正常
3、更换萌咔Debian9系统不改内核:Start反应很快,IP识别正常
4、更换萌咔Debian9系统更换锐速内核:Start反应1分钟,IP识别不到运营商和位置。

能否指导下,怎么查看问题出在哪

ipv6测速

想问一下如何开启ipv6地址测速,支持用户使用ipv6的地址进行测速吗

docker 指定参数无效

docker 启动指定参数没用
docker run -e MAX_LOG_COUNT=1000 -e IP_SERVICE=ip.sb -e SAME_IP_MULTI_LOGS=true -e WEBPORT=86 --name speedtest -it -d -p 9994:86 -it badapple9/speedtest-x
没一个-e参数起作用

获取不了IP运营商和城市

可以获得公网IP:

IP地址: aa.bb.cc.dd - Unknown

2个IP库都如此,请问会是什么原因?

源站IP被地址库拉黑?

为什么这个版本比原版本测试表现好?

在同一台机器(ubuntu 16.04) 用docker 部署,测试

docker pull badapple9/speedtest-x
docker run -d --restart=always --name speedtest -p 9001:80 -it badapple9/speedtest-x

docker pull adolfintel/speedtest
docker run -d --restart=always -p 8080:80 adolfintel/speedtest:latest

firefox 打开:
http://127.0.0.1:9001
http://127.0.0.1:8080

为什么这个版本 speedtest-x 比原版本测试 speedtest 表现好?作了什么改进? 有空可以介绍下吗?谢谢。

测速没有速度,求解

在一个vps服务器(Ubuntu 18.04 with Docker)上安装speedtestx,测速时延迟很大(几百ms),上行只有1Mbps,为啥啊?

查看测速记录显示:数据接口请求异常:parsererror

Debian 10系统,apt命令安装的nginx和php7.3
apt update && apt install php php-fpm curl tar nginx -y
查看测速记录显示:数据接口请求异常:parsererror,查看线性图表则显示:Can't get data。
宝塔同版本的php则可以正常显示测速记录。
Nginx配置文件中php部分如下

location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.3-fpm.sock;
    }

是否是php缺了某个扩展?还是其他原因导致的错误

宝塔+nginx+php无法测速

无法测速,结果也无法查看,显示:数据接口请求异常:parsererror
不知道是不是我配置有问题噢。

重新部署了一下,默认配置,测速页面显示IP底地方获取不到IP和位置,要等好久才开始测速。
问题如下:
默认config.php中是“ip.sb” 无法获取IP,显示“Unknown”
改成“ipinfo.io”后正常,可获取ip位置。

直接部署到LXC容器内的Apache服务端内已二级目录为存在,但是出现了一些问题。

我计划用这个speedtest-x部署作内网测速使用,已经放到我的DebianLXC容器内的Apache服务端目录内,并且作为二级目录存在,但是出了一点问题,就是在第一次使用本机做测速的时候,当时的内网速度是1Gbps,下载速度很不正常,只有不足10Mbps,上传是正常的,且IP地址显示错误,显示为
IP地址: <?php /* * This script detects the client's IP address and fetches ISP info from ipinfo.io/ * Output from this script is a JSON string composed of 2 objects: a string called processedString which contains the combined IP, ISP, Contry and distance as it can be presented to the user; and an object called rawIspInfo which contains the raw data from ipinfo.io (will be empty if isp detection is disabled). * Client side, the output of this script can be treated as JSON or as regular text. If the output is regular text, it will be shown to the user as is. / require_once "./config.php"; error_reporting(0); define('API_KEY_FILE', 'getIP_ipInfo_apikey.php'); define('SERVER_LOCATION_CACHE_FILE', 'getIP_serverLocation.php'); /* * @return string / function getClientIp() { if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (!empty($_SERVER['HTTP_X_REAL_IP'])) { $ip = $_SERVER['HTTP_X_REAL_IP']; } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; $ip = preg_replace('/,./', '', $ip); # hosts are comma-separated, client is first } else { $ip = $_SERVER['REMOTE_ADDR']; } return preg_replace('/^::ffff:/', '', $ip); } /** * @param string $ip * * @return string|null / function getLocalOrPrivateIpInfo($ip) { // ::1/128 is the only localhost ipv6 address. there are no others, no need to strpos this if ('::1' === $ip) { return 'localhost IPv6 access'; } // simplified IPv6 link-local address (should match fe80::/10) if (stripos($ip, 'fe80:') === 0) { return 'link-local IPv6 access'; } // anything within the 127/8 range is localhost ipv4, the ip must start with 127.0 if (strpos($ip, '127.') === 0) { return 'localhost IPv4 access'; } // 10/8 private IPv4 if (strpos($ip, '10.') === 0) { return 'private IPv4 access'; } // 172.16/12 private IPv4 if (preg_match('/^172.(1[6-9]|2\d|3[01])./', $ip) === 1) { return 'private IPv4 access'; } // 192.168/16 private IPv4 if (strpos($ip, '192.168.') === 0) { return 'private IPv4 access'; } // IPv4 link-local if (strpos($ip, '169.254.') === 0) { return 'link-local IPv4 access'; } return null; } /* * @return string / function getIpInfoTokenString() { if (!file_exists(API_KEY_FILE)) { return ''; } require API_KEY_FILE; if (empty($IPINFO_APIKEY)) { return ''; } return '?token='.$IPINFO_APIKEY; } /* * @param string $ip * * @return array|null / function getIspInfo($ip, $ipService) { $json = ''; if ($ipService == 'ip.sb') { $json = file_get_contents('https://api.ip.sb/geoip/' . $ip); } elseif ($ipService == 'ipinfo.io') { $json = file_get_contents('https://ipinfo.io/'.$ip.'/json'.getIpInfoTokenString()); } if (!is_string($json)) { return null; } $data = json_decode($json, true); if (!is_array($data)) { return null; } return $data; } /* * @param array|null $rawIspInfo * * @return string / function getIsp($rawIspInfo, $ipService) { if ($ipService == 'ip.sb') { if ( !is_array($rawIspInfo) || !array_key_exists('organization', $rawIspInfo) || !is_string($rawIspInfo['organization']) || empty($rawIspInfo['organization']) ) { return 'Unknown'; } return $rawIspInfo['organization']; } elseif ($ipService == 'ipinfo.io') { if ( !is_array($rawIspInfo) || !array_key_exists('org', $rawIspInfo) || !is_string($rawIspInfo['org']) || empty($rawIspInfo['org']) ) { return 'Unknown'; } return preg_replace('/AS\d+\s/', '', $rawIspInfo['org']); } return 'Unknown'; } /* * @return string|null / function getServerLocation() { $serverLoc = null; if (file_exists(SERVER_LOCATION_CACHE_FILE)) { require SERVER_LOCATION_CACHE_FILE; } if (is_string($serverLoc) && !empty($serverLoc)) { return $serverLoc; } $json = file_get_contents('https://ipinfo.io/json'.getIpInfoTokenString()); if (!is_string($json)) { return null; } $details = json_decode($json, true); if ( !is_array($details) || !array_key_exists('loc', $details) || !is_string($details['loc']) || empty($details['loc']) ) { return null; } $serverLoc = $details['loc']; $cacheData = "<?php\n\n$serverLoc = '".addslashes($serverLoc)."';\n"; file_put_contents(SERVER_LOCATION_CACHE_FILE, $cacheData); return $serverLoc; } /* * Optimized algorithm from http://www.codexworld.com * * @param float $latitudeFrom * @param float $longitudeFrom * @param float $latitudeTo * @param float $longitudeTo * * @return float [km] / function distance( $latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo ) { $rad = M_PI / 180; $theta = $longitudeFrom - $longitudeTo; $dist = sin($latitudeFrom * $rad) * sin($latitudeTo * $rad) + cos($latitudeFrom * $rad) * cos($latitudeTo * $rad) * cos($theta * $rad); return acos($dist) / $rad * 60 * 1.853; } /* * @param array|null $rawIspInfo * * @return string|null / function getDistance($rawIspInfo) { if ( !is_array($rawIspInfo) || !array_key_exists('loc', $rawIspInfo) || !isset($_GET['distance']) || !in_array($_GET['distance'], ['mi', 'km'], true) ) { return null; } $unit = $_GET['distance']; $clientLocation = $rawIspInfo['loc']; $serverLocation = getServerLocation(); if (!is_string($serverLocation)) { return null; } return calculateDistance( $serverLocation, $clientLocation, $unit ); } /* * @param string $clientLocation * @param string $serverLocation * @param string $unit * * @return string / function calculateDistance($clientLocation, $serverLocation, $unit) { list($clientLatitude, $clientLongitude) = explode(',', $clientLocation); list($serverLatitude, $serverLongitude) = explode(',', $serverLocation); $dist = distance( $clientLatitude, $clientLongitude, $serverLatitude, $serverLongitude ); if ('mi' === $unit) { $dist /= 1.609344; $dist = round($dist, -1); if ($dist < 15) { $dist = '<15'; } return $dist.' mi'; } if ('km' === $unit) { $dist = round($dist, -1); if ($dist < 20) { $dist = '<20'; } return $dist.' km'; } return null; } /* * @return void / function sendHeaders() { header('Content-Type: application/json; charset=utf-8'); if (isset($_GET['cors'])) { header('Access-Control-Allow-Origin: '); header('Access-Control-Allow-Methods: GET, POST'); } header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0, s-maxage=0'); header('Cache-Control: post-check=0, pre-check=0', false); header('Pragma: no-cache'); } / * @param string $ip * @param string|null $ipInfo * @param string|null $distance * @param array|null $rawIspInfo * * @return void */ function sendResponse( $ip, $ipInfo = null, $rawIspInfo = null ) { $processedString = $ip; if (is_string($ipInfo)) { $processedString .= ' - '.$ipInfo; } if ( is_array($rawIspInfo) && array_key_exists('country', $rawIspInfo) ) { $processedString .= ' - '.$rawIspInfo['country'] . ',' . $rawIspInfo['region'] . ',' . $rawIspInfo['city']; } sendHeaders(); echo json_encode([ 'processedString' => $processedString, 'rawIspInfo' => $rawIspInfo ?: '', ]); } $ip = getClientIp(); $localIpInfo = getLocalOrPrivateIpInfo($ip); // local ip, no need to fetch further information if (is_string($localIpInfo)) { sendResponse($ip, $localIpInfo); exit; } if (!isset($_GET['isp'])) { sendResponse($ip); exit; } $rawIspInfo = getIspInfo($ip, IP_SERVICE); $isp = getIsp($rawIspInfo, IP_SERVICE); //$distance = getDistance($rawIspInfo); sendResponse($ip, $isp, $rawIspInfo);
请问这两个问题该如何解决?

大佬,ip库还有没有别的选择?

默认的ip.sb和ipinfo.io都不准确,把我这里移动识别为广东移动,联通识别为辽宁联通,电信识别为陕西榆林电信,教育网则不识别具体地址,没有一个正确的。

local .js auto start?

Подскажете как автоматически запускать speedtest-x на сайте?
например через js...

Хочу тестировать локальную сеть...

Can you tell me how to automatically run speedtest-x on the site?
for example via js ...

I want to test a local network ...

似乎无法测速

IP识别显示400
测速记录显示数据接口error
下载速度0
上传正常
Ping和抖动正常

同一个IP多次测速只会显示一次

我在家庭网络中设置了一个单独的网段,从其他网段的访问时,测速的来源IP都是网关的IP地址,测速历史中只会保留最新的一条记录。
image

测速结果无法显示

zip版本,全部解压使用,测速功能正常,但测速结果(results.html)显示

数据接口请求异常:error

环境 nginx php(7.3)

端口映射到8081,配置在/web/speedtestx/ 使用,根目录指向该目录
访问为 http://ip:8081/

Docker 容器如何持久化测速结果?

README.md 里没有说明 Docker 容器挂载哪个文件夹才能持久化测速结果。导致我现在只要删除容器再启动,测速结果就全部没有了。请问要挂载哪个文件夹?

traefik部署访问失败

部署环境: Ubuntu 22.04.3 LTS

使用docker compose 部署:

version: '3.9'
services:
speedtest-x:
image: badapple9/speedtest-x
container_name: speedtest
restart: unless-stopped
tty: true
stdin_open: true
networks:
- traefik
ports:
- '9011:80'
labels:
traefik.enable: true
traefik.docker.network: traefik
traefik.http.routers.speedtest.rule: Host(speedtest.*.cn)
traefik.http.routers.speedtest.tls: true
traefik.http.routers.speedtest.tls.certresolver: myresolver
traefik.http.services.speedtest.loadbalancer.server.port: 9011

networks:
traefik:
external: true

无法访问,显示404 page not found, docker log如下:

  • cp /speedtest/speedtest.js /speedtest/speedtest_worker.js /var/www/html/
  • cp /speedtest/chart.html /speedtest/index.html /speedtest/results.html /var/www/html/
  • cp -r /speedtest/backend/ /var/www/html/backend
  • cp -r /speedtest/chartjs/ /var/www/html/chartjs
  • ln -snf /var/www/html/backend/speedlogs /speedlogs
  • chown -R www-data /var/www/html/backend /var/www/html/chart.html /var/www/html/chartjs /var/www/html/index.html /var/www/html/results.html /var/www/html/speedtest.js /var/www/html/speedtest_worker.js
  • '[' 80 '!=' 80 ']'
  • '[' 100 '!=' 100 ']'
  • '[' ip.sb '!=' ip.sb ']'
  • '[' false '!=' false ']'
  • echo 'Done, Starting APACHE'
    Done, Starting APACHE
  • apache2-foreground
    AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.26.0.7. Set the 'ServerName' directive globally to suppress this message
    AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.26.0.7. Set the 'ServerName' directive globally to suppress this message
    [Sat Dec 16 11:30:24.954697 2023] [mpm_prefork:notice] [pid 13] AH00163: Apache/2.4.54 (Debian) PHP/7.4.33 configured -- resuming normal operations
    [Sat Dec 16 11:30:24.954752 2023] [core:notice] [pid 13] AH00094: Command line: 'apache2 -D FOREGROUND'

本地部署运营商与地区显示Unknown

github下载到本地再通过宝塔上传到了网站目录,内核为debian10 自带内核 Debian GNU/Linux 10 KVM x86_64 4.19.0-17-amd64,在另一台vps上也出现了同样的问题

结果页仍然不能显示

拉取的是最新的docker镜像,但是并没有解决问题 #47
查看results.html 34行内为https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/layui/2.5.7/layui.js,尝试通过映射/var/www/html到宿主机,更改34行内为https://www.layuicdn.com/layui/layui.js(该链接有效),但是容器重启后宿主机的results.html会被重置。

[new feature]单IP多次测试只记录一条

在不同时间测试速度,希望能记下每次的速度和时间,但是只有最后一条记录。
希望至少能加个开关允许相同ip记录多次(可以设置时间间隔什么的)


可能恶意刷流量那个是不是可以考虑将最大值限死

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.