首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Nginx + PHP 文件上傳大小限制完整設定指南

     編輯:PHP 相關知識

上傳失敗?通常是這三層限制卡住你

文件上傳受限於 PHP 設定、Nginx 設定、瀏覽器/客戶端 三層。只要其中一層設定過小,大檔上傳就會失敗(常見 413 Request Entity Too Large 或靜默截斷)。

第一層:PHP 核心設定 (php.ini)

; 1. POST 資料總大小上限(必須 ≥ upload_max_filesize)
post_max_size = 100M

; 2. 單一文件上傳上限
upload_max_filesize = 100M

; 3. 腳本最大執行時間(大檔上傳需較久,建議 300 秒以上)
max_execution_time = 300

; 4. 記憶體限制(處理大檔案時可能需調大)
memory_limit = 256M

; 5. 輸入時間限制(含上傳時間)
max_input_time = 300

關鍵關係:post_max_size ≥ upload_max_filesize。若 POST 包含多個檔案或其他表單欄位,post_max_size 需大於所有檔案總和。

第二層:Nginx 客戶端請求大小限制

# nginx.conf 或 site-enabled/your-site.conf
http {
    # 客戶端請求主體最大值(預設 1m)
    client_max_body_size 100m;
    
    # 緩衝區設定(大檔上傳建議調大)
    client_body_buffer_size 16k;
    
    # 超時設定
    client_body_timeout 60s;
}

修改後執行平滑重載:

nginx -t && nginx -s reload

第三層:PHP-FPM 進程管理(常被忽略)

<?php
echo 'post_max_size: ' . ini_get('post_max_size') . PHP_EOL;
echo 'upload_max_filesize: ' . ini_get('upload_max_filesize') . PHP_EOL;
echo 'memory_limit: ' . ini_get('memory_limit') . PHP_EOL;
echo 'max_execution_time: ' . ini_get('max_execution_time') . PHP_EOL;
?>
  • 實際上傳測試檔案(略小於設定值、等於設定值、略大於設定值)
  • 大檔上傳進階優化

    • 分片上傳:前端切片(如 5MB/片),後端合併,繞過單一請求大小限制
    • 斷點續傳:配合 Content-Range、Resumable.js、Uppy 等庫
    • 直接上傳雲存儲:簽名 URL 直傳 S3/OSS/COS,減輕應用伺服器頻寬壓力
    • 進度顯示:session.upload_progress (PHP 5.4+) 或 XMLHttpRequest Level 2 upload.onprogress

    常見錯誤排查

    現象可能原因解決方向
    413 Request Entity Too LargeNginx client_max_body_size 過小調大 Nginx 設定並 reload
    $_FILES 為空、$_POST 為空PHP post_max_size 過小調大 php.ini 並重啟 PHP-FPM
    上傳大檔案中途斷開Nginx/PHP-FPM 超時設定過短調大 client_body_timeout、request_terminate_timeout
    上傳成功但檔案損壞磁碟空間不足、upload_tmp_dir 權限問題檢查 df -h、臨時目錄寫入權限

    依照本指南逐層檢查設定,即可解決 99% 的文件上傳大小限制問題。記得:改完設定必須重啟對應服務才會生效。

    1. 上一篇文章:
    2. 下一篇文章:
    Copyright © 程式碼之家 All Rights Reserved