librespeed c++ 上传下载带宽测试 排坑全流程

在搭建 LibreSpeed 测速服务并实现基于 curl/API 的上传下载测试时,遇到 Nginx 配置冲突、PHP 权限异常等问题。本文将梳理从环境搭建到功能验证的全流程,针对 “curl 上传报 404/405”“PHP-FPM 权限拒绝”等典型问题,提供可复现的解决方案。

初始需求:c++后端开发用librespeed测试download,upload的带宽。

一开始思考:测带宽为什么不用iperf3或者ftp直接测呢,明明都是tcp,要用http测试(本质还是tcp),这个librespeed之前没有使用过,网上一搜也是无脑安装直接使用教程,也没有人用c++去进行测试。

决定:使用curl去进行librespeed测试

第一步:搭建 “Nginx+PHP-FPM+LibreSpeed” 环境

  1. 通过 curl 命令测试上传 / 下载带宽
  2. 通过 C++ 程序调用 LibreSpeed 接口实现自动化测速

整个流程中,Nginx 负责接收请求并转发静态文件 / PHP 脚本,PHP-FPM 执行 PHP 逻辑(处理上传请求),curl/C++ 作为客户端发起测试请求。

里面有两个核心命令:

#上传:
curl -w "上传大小: %{size_upload} 字节\n用时: %{time_total} 秒\n平均速度: %{speed_upload} 字节/秒\n" -F "file=@large_testfile" "http://192.168.1.1/librespeed/empty.php?action=upload"#下载
curl -w "下载大小: %{size_download} 字节\n用时: %{time_total} 秒\n平均速度: %{speed_download} 字节/秒\n" -o /dev/null "http://192.168.1.1/librespeed/bargage.php"

仿服务器设备ip:192.168.1.1

终端设备ip:192.168.1.2

所有的librespeed配置在服务器中安装。

1.安装基础依赖:nginx,php-fpm,curl,librespeed

这里记住:

把librespeed放在你要访问的html目录下,并授权(chomd 777...)

记住php版本号。

#1:
# 安装 Nginx、PHP-FPM 及必要扩展
sudo apt install -y nginx php8.1-fpm php8.1-curl php8.1-json php8.1-mbstring# 安装 curl(用于测试)和 unzip(解压源码)
sudo apt install -y curl unzip# 检查服务是否运行
sudo systemctl status php8.1-fpm# 若未运行,启动并设置开机自启
sudo systemctl start php8.1-fpm
sudo systemctl enable php8.1-fpm#2:下载并解压Librespeed源码:
# 进入网站目录
cd /opt/www/html# 从 GitHub 下载最新源码(主分支)
sudo -u www-data wget https://github.com/librespeed/speedtest/archive/refs/heads/master.zip -O librespeed.zip# 解压源码(需 www-data 用户权限,避免后续权限问题)
sudo -u www-data unzip librespeed.zip# 重命名目录(简化访问路径)
sudo -u www-data mv speedtest-master librespeed# 清理压缩包
sudo -u www-data rm librespeed.zip

2.nginx文件配置

配置成功后restart。

server {listen 80;server_name localhost;  # 可替换为实际域名# 网站根目录(LibreSpeed 所在路径)root /opt/www/html;# 默认索引页(优先解析 PHP)index index.php index.html;# 访问日志(便于排查问题)access_log /var/log/nginx/librespeed_access.log;error_log /var/log/nginx/librespeed_error.log;# LibreSpeed 专用配置location /librespeed/ {# 允许上传大文件(根据需求调整)client_max_body_size 600M;# 路径匹配逻辑try_files $uri $uri/ /librespeed/index.php?$query_string;# 允许 POST 请求(测速必需)limit_except GET HEAD OPTIONS {allow all;}}# PHP 脚本处理(仅匹配 LibreSpeed 路径,避免全局冲突)location ~ ^/librespeed/.*\.php$ {# 确保 PHP 能找到正确的脚本路径fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;# 连接 PHP-FPM 的 socketfastcgi_pass unix:/run/php/php8.1-fpm.sock;# 加载 PHP 基础参数include fastcgi_params;# PHP 索引页fastcgi_index index.php;}# 错误页配置(使用自定义页面)error_page 404 /404.html;error_page 500 502 503 504 /50x.html;location = /50x.html {root /opt/www/html;  # 错误页放在网站根目录}
}

3.php-fpm配置修改

# 编辑 PHP-FPM 池配置文件
sudo nano /etc/php/8.1/fpm/pool.d/www.conf
# 1. 运行用户与组(需与 Nginx 一致,默认 Nginx 用 www-data)
user = www-data
group = www-data# 2. Socket 文件配置(解决权限问题)
listen = /run/php/php8.1-fpm.sock  # socket 路径
listen.owner = www-data
listen.group = www-data
listen.mode = 0660  # 允许用户和组读写# 3. 性能优化(根据服务器配置调整)
pm = dynamic  # 动态进程管理
pm.max_children = 50  # 最大进程数
pm.start_servers = 5  # 启动时的进程数
pm.min_spare_servers = 5  # 最小空闲进程数
pm.max_spare_servers = 10  # 最大空闲进程数
sudo systemctl restart php8.1-fpm# 验证配置是否生效(查看 socket 文件权限)
ls -la /run/php/php8.1-fpm.sock
# 预期输出:srw-rw---- 1 www-data www-data ...

第二步:进行测试

#上传:
curl -w "上传大小: %{size_upload} 字节\n用时: %{time_total} 秒\n平均速度: %{speed_upload} 字节/秒\n" -F "file=@large_testfile" "http://192.168.1.1/librespeed/empty.php?action=upload"#下载
curl -w "下载大小: %{size_download} 字节\n用时: %{time_total} 秒\n平均速度: %{speed_download} 字节/秒\n" -o /dev/null "http://192.168.1.1/librespeed/bargage.php"

发现问题:

1.执行 curl 上传命令时,报405错误

这里很有可能是nginx配置问题

因为Librespeed的上传接口是通过PHP处理的,如果Nginx没有正确配置FastCGI来处理.php文件请求,服务器就无法识别POST请求,并返回405错误。

需要确保Nginx在请求到达PHP文件时能够正确地将其转发给PHP处理器(例如,使用php-fpm)。如果没有这部分配置,Nginx就无法执行PHP代码,只能返回405错误。

    # PHP 脚本处理(仅匹配 LibreSpeed 路径,避免全局冲突)location ~ ^/librespeed/.*\.php$ {# 确保 PHP 能找到正确的脚本路径fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;# 连接 PHP-FPM 的 socketfastcgi_pass unix:/run/php/php8.1-fpm.sock;# 加载 PHP 基础参数include fastcgi_params;# PHP 索引页fastcgi_index index.php;}

2.加上后报404错误

报这个错的原因很简单,没有权限或者找不到:

检查/opt/www/html路径下有没有文件

检查相关文件和路径权限,是否是755或777

花了好久查到这里:

php-fpm权限:检查可执行文件/run/php/php8.1-fpm.sock对应的可执行用户。

心路历程:

在nginx配置里添加日志记录指令,

检查配置并重启 Nginx

location ~ \.php$ {root           /opt/www/html;fastcgi_pass   unix:/run/php/php8.1-fpm.sock;fastcgi_index  index.php;fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;include        fastcgi_params;# 关键:记录实际执行的PHP脚本路径到日志access_log /var/log/nginx/php_access.log;error_log /var/log/nginx/php_error.log;# 允许POST方法limit_except GET HEAD OPTIONS {allow all;}
}

查看日志显示报错:

2025/09/17 02:56:19 [crit] 69213#69213: *1 connect() to unix:/run/php/php8.1-fpm.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.1.2, server: localhost, request: "GET /librespeed/empty.php?action=upload HTTP/1.1", upstream: "fastcgi://unix:/run/php/php8.1-fpm.sock:", host: "192.168.1.1"

日志中 Permission denied 错误表明 Nginx 工作进程(www-data 用户)没有权限访问 PHP-FPM 的 socket 文件/run/php/php8.1-fpm.sock

去查看权限:

ls -la /run/php/php8.1-fpm.sock

srw-rw---- 1 nobady --- 0 Sep 17 02:56 /run/php/php8.1-fpm.sock

找到问题了,这里并不是我在www.conf里配置的ww-data而是nobady

但是我配置文件里明明是www.conf

我决定重启:

sudo systemctl restart php8.1-fpm

再进行测试,则成功。

可能原因:

  1. 配置项被覆盖www.conf 中 user/group 配置后,又有其他配置项(如 listen.mode 间接影响)或「全局配置」覆盖了用户设置;
  2. 权限继承冲突:PHP-FPM 进程的父进程(如 root 启动的主进程)未正确传递用户权限,或目录权限限制导致用户切换失败。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/98278.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/98278.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重读生成概率模型1----基础概念

1 KL 散度 KL 散度的作为是描述两个分布的差异的,首先是度量一个分布,用熵来度量。 1.1 熵 在介绍熵之间,首先要度量单个事件的信息量 I(x)−logP(x)I(x)-logP(x)I(x)−logP(x) 整体的信息量 H(P)Ex P[−logP(x)]−∑P(x)logP(x) \begin{alig…

排查解决磁盘占用高问题(容器挂载的磁盘)

最近遇到磁盘占用高的告警,记录一下解决的思路。 首先是系统触发告警,通知我们某台机器磁盘占用高。(或其他途径得知) 通过XShell登录该机器。 执行df-h命令查看挂载占用情况找到真正占用高的挂载点挂载点/home目录占用高&#xf…

流体(1)

流体 Minecraft 中的流体(Fluid),也常被称为液体(Liquid),是一类能够自由流动、形成河流、瀑布或湖泊的特殊方块。它们的行为基于简化的流体力学,是游戏世界中动态环境的重要组成部分。 💧 流体是什么? 在 Minecraft 中,流体核心特点包括: 源方块与流动:每个流…

机器学习-卷积神经网络(CNN)

全连接层->卷积层 用有一个隐藏层的MLP训练ImageNet数据集(300*300的图像,有1000个类别),要有10000个输出 会有10亿个可学习的参数,量太大 全连接:一个输出是根据所有输入加权得到在图片中识别物体&…

Ubuntu 磁盘扩容与扩容失败问题解决( df -h 与 GParted 显示空间不一致的问题 -LVM)

在管理 Linux 磁盘时,你是否遇到过这样的困惑:正常扩容之后,发现GParted 显示某个分区还有几十 GiB 可用,但 df -h 却提示该分区已接近满额?这种 “空间幻觉” 背后是系统存储管理的分层设计,本文将从原理到…

PyQt5中QLineEdit控件数值显示与小数位数控制

在PyQt5应用程序开发中,QLineEdit控件常用于显示和编辑文本内容。当需要用它来显示数值并控制小数位数时,开发者需要掌握一些特定的技巧。本文将深入探讨几种实现方法,每种方法都附带完整独立的代码示例。 数值格式化基础 在Python中&#xf…

LangChain使用方法以OpenAI 的聊天模型GPT-4o为例

以使用 OpenAI 的聊天模型(如 GPT-4)为例,从设置环境、初始化模型、调用模型到处理响应的各个方面进行介绍: 1. 环境设置 安装 langchain-openai 包。设置环境变量 OPENAI_API_KEY,用于认证(以linux为例&am…

Oracle为数据大表创建索引方案

在日常业务中,避免不了为数据量大表补充创建索引的情况,如果快速、有效地创建索引成了一个至关重要的问题(注意:虽然提供有ONLINE在线执行的方式,理想状态下不会阻塞DML操作,但ONLINE在开始、结束的两个时刻…

网站服务相关问题

目录 HTTP常见的状态码 http和https的区别以及使用的端口号 http处理请求的过程 https认证过程 正向代理和反向代理的区别 HTTP常见的状态码 HTTP(超文本传输协议)定义了一系列的状态码,用于表示客户端请求的处理结果。以下是一些常见的…

Go并发编程实战:深入理解Goroutine与Channel

Go并发编程实战:深入理解Goroutine与ChannelGo并发编程实战:深入理解Goroutine与Channel概述1. 为什么是Go的并发?从“线程”与“协程”说起2. Goroutine:如何使用?3. Channel:Goroutine间的安全通信创建与…

2025服贸会“海淀之夜”,点亮“科技”与“服务”底色

2025年9月12日傍晚,北京颐和园,十七孔桥旁,2025年中国国际服务贸易交易会“海淀之夜”如约而至。在“海淀之夜”,科技机构、金融机构、咨询服务机构、出海服务企业以及跨国企业和国际友人等,将目光聚焦于此。被第三方机…

qt使用camke时,采用vcpkg工具链设置VTK的qt模块QVTKOpenGLNativeWidget

下载:QVTKOpenGLNativeWidget嵌入qt应用中资源-CSDN下载 1.通过vcpkg安装VTK,目前的VTK里面默认为qt6,如果需要安装qt5,需要将端口配置进行修改 笔者的vcpkg的vtk端口路径:D:\vcpkg\ports\vtk portfile.cmake 修改点: #第一处 #file(READ "${CURRENT_INSTALLED_DIR}/sh…

Axios在鸿蒙应用开发中的使用

目录一、简介二、安装与配置三、axios用法1.axios泛型参数(1).第三个泛型参数-约束data请求参数的类型(2).第二个泛型参数-决定后台返回数据的类型2.axios拦截器3.请求工具封装统一处理业务状态码错误统一处理401或404错误一、简介 Axios 是一个基于 Promise 的网络请求库&…

第九周文件上传

文件上传漏洞 不同的网站要不同的webshell。我们使用是php开发的网站。 一服务器白名单绕过 服务端白名单(Whitelist)是⼀种安全机制,它只允许预定义的合法元素通过(只有有限的元素进入),其他所有内容默认被拒绝。相比黑名单&am…

计算机视觉必读论文:从经典到前沿

计算机视觉必读论文:从经典到前沿 一、前言 二、经典论文解读​ 2.1 图像分类​ 2.1.1 《ImageNet Classification with Deep Convolutional Neural Networks》(AlexNet)​ 2.1.2 《Very Deep Convolutional Networks for Large-Scale Image Recognition》(VGGNet)​ 2.1.…

对比PowerBI的字段参数,QuickBI的已选字段还有改进的空间

对比PowerBI的字段参数,QuickBI的已选字段还有改进的空间 之前分享过QuickBI的已选字段 vs PowerBI的字段参数,QuickBI可以在表格中实现PowerBI的字段参数效果,甚至比PowerBI实现的过程和使用方式更丝滑。 但如果应用到图形中会怎么样呢&am…

飞算JavaAI:Java开发新时代的破晓之光

免责声明:此文章的所有内容皆是本人实验测评,并非广告推广,并非抄袭。如有侵权,请联系,谢谢!【#飞算JavaAl炫技赛】 【#Java开发】摘要:飞算JavaAI作为全球首款聚焦Java的智能开发助手&#xff…

vulntarget-c靶场内网渗透

1. 环境搭建 2.对ubuntu20的渗透 对其进行端口扫描 访问80端口 发现是laravel框架。版本是v8.78.1 使用 kaili 自带的msf 进行渗透 search laravel use exploit/multi/php/ignition_laravel_debug_rce执行利用完成检测 上传木马 先将木马进行base64编码 <?php eval($_P…

基于大模型多模态的人体体型评估:从“尺码测量”到“视觉-感受”范式

基于大模型多模态的人体体型评估&#xff1a;从“尺码测量”到“视觉-感受”范式摘要&#xff1a;传统体型识别依赖CV骨架/关键点与像素量尺&#xff0c;容易受衣物、发型、姿态、光照影响&#xff0c;且“厘米级数值”与穿衣体验、审美感受之间存在鸿沟。本文提出一种基于大模…

【docker】——docker国内可用的源

不知道哪里来的&#xff0c;但是可以用。1. 解决方案打开配置文件&#xff08;若文件不存在&#xff0c;会自动创建&#xff09; sudo vim /etc/docker/daemon.json将以下内容粘贴进去{"builder": {"gc": {"defaultKeepStorage": "20GB&quo…