在搭建 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” 环境
- 通过 curl 命令测试上传 / 下载带宽
- 通过 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
再进行测试,则成功。
可能原因:
- 配置项被覆盖:
www.conf
中user
/group
配置后,又有其他配置项(如listen.mode
间接影响)或「全局配置」覆盖了用户设置; - 权限继承冲突:PHP-FPM 进程的父进程(如
root
启动的主进程)未正确传递用户权限,或目录权限限制导致用户切换失败。