在搭建 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
?啟動的主進程)未正確傳遞用戶權限,或目錄權限限制導致用戶切換失敗。