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
英文地址,請注明出處:http://en.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…