librespeed-cli连接超时原因分析

现象

换上专网后,我的后端尝试调用librespeed失败,使用终端命令行连接远端服务器接口显示连接超时。100%复现。

换回原来的网络就可以正常通讯:

解决

使用curl测试,发现立刻返回链路正常,一直找不到原因(这里埋了个坑❗)。

换不同德网络现象不一样,curl能通但librespeed不可以,那么先研究一下curl和librespeed有什么区别,发现librespeed可以自动优化网络策略。

怀疑是这个问题,后面强制让librespeed使用ipv4,固定网卡,有50%的几率可以成功,换一套网络访问相同的服务器就可以。

./out/librespeed-cli-linux-arm64 \

--ipv4 \

--interface usb0 \

--timeout 30 \

--local-json new.json

回到原来的起点,使用curl指令,怀疑curl只执行了部分链接,加个""(记住了之后用curl要加"")。

curl "http://10.230.12.28/backend/getIP.php?distance=km\&isp=true"

这回现象和librespeed一模一样,改成

curl "http://10.230.12.28/backend/getIP.php?distance=km"

可以立刻返回,说明"isp=true"有问题。

进到服务器:

docker ps

复制代码
CONTAINER ID   IMAGE          NAMES
f6565ba48d49   librespeed     librespeed-server

docker exec -it librespeed-server /bin/bash

cat /var/www/html/backend/getIP.php

找到相关代码:

php 复制代码
  if (is_string($ipInfo)) {
        $processedString .= ' - '.$ipInfo;
    }

    if (
        is_array($rawIspInfo)
        && array_key_exists('country', $rawIspInfo)
    ) {
        $processedString .= ', '.$rawIspInfo['country'];
    }
    if (is_string($distance)) {
        $processedString .= ' ('.$distance.')';
    }

    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);  
$isp = getIsp($rawIspInfo);
$distance = getDistance($rawIspInfo);

sendResponse($ip, $isp, $distance, $rawIspInfo);

这段代码里,只有带了isp,就会执行

php 复制代码
$rawIspInfo = getIspInfo($ip);
$isp = getIsp($rawIspInfo);
$distance = getDistance($rawIspInfo);

getIspInfo($ip) 正是:

  • 反向 DNS

  • whois

  • 第三方 API

  • GeoIP

这些在专网/内网/NAT环境下极容易卡死或超时,于是 CLI 就等不到 header,直接报错。

把下面这段:

php 复制代码
if (!isset($_GET['isp'])) {
    sendResponse($ip);
    exit;
}

$rawIspInfo = getIspInfo($ip);
$isp = getIsp($rawIspInfo);
$distance = getDistance($rawIspInfo);

sendResponse($ip, $isp, $distance, $rawIspInfo);

改成:

php 复制代码
if (!isset($_GET['isp'])) {
    sendResponse($ip);
    exit;
}

// === 专网 / 内网环境:禁用 ISP 查询,防止阻塞 ===
sendResponse($ip, null, null, null);
exit;
  • 保留 isp 参数兼容性

  • 但不再调用 getIspInfo()

  • 直接返回一个"没有 ISP 的正常 JSON"

  • 不再进入任何 ISP / whois / DNS / 外部查询

大概率会返回:

php 复制代码
{
  "processedString": "172.170.11.47",
  "rawIspInfo": ""
}

修改指令:

php 复制代码
sed -i '/\$rawIspInfo = getIspInfo/,+4c\sendResponse($ip);\nexit;' /var/www/html/backend/getIP.php

确认修改成功,进行验证,成功!

相关推荐
BingoGo13 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack13 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack2 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack4 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理4 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
QQ5110082854 天前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php
WeiXin_DZbishe4 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5