Nginx + PHP-FPM 架構下檔案上傳失敗,常見癥狀為「413 Request Entity Too Large」、「POST 請求大小限制」或上傳後檔案為 0 字節。根因通常涉及 Nginx、PHP-FPM、PHP 三層限制疊加。本文提供系統性排查清單與標準化配置模板。
客戶端請求
│
▼
Nginx (client_max_body_size, client_body_temp_path)
│
▼
PHP-FPM (fastcgi_request_buffering, fastcgi_max_temp_file_size)
│
▼
PHP 核心 (upload_max_filesize, post_max_size, memory_limit, max_execution_time, max_input_time)
location ~ \.php$ {
root /var/www/html/public;
client_max_body_size 50M; # 允許最大請求體,預設 1M
client_body_temp_path /tmp; # 上傳臨時目錄,必須 PHP-FPM 進程用戶可寫
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
注意: 若啟用 fastcgi_request_buffering off;,大檔直接寫入磁臨時檔,減少記憶體壓力,但需確保 client_body_temp_path 分區空間充足。
; 允許單次請求最大緩衝 (預設 1M,建議與 client_max_body_size 一致)
request_terminate_timeout = 300
; 大檔案上傳建議關閉請求緩衝,直接落盤
fastcgi_request_buffering = off
fastcgi_max_temp_file_size = 100M
| 參數 | 建議值 | 說明 |
|---|---|---|
| file_uploads | On | 總開關 |
| upload_max_filesize | 100M | 單檔上限 |
| post_max_size | 110M | 必須 > upload_max_filesize,含表單其他欄位 |
| max_execution_time | 300 | 腳本最大執行秒數,大檔上傳需放寬 |
| max_input_time | 300 | 接收 POST/GET/PUT 數據最大秒數 |
| memory_limit | 256M | 單腳本記憶體上限,≥ post_max_size |
| upload_tmp_dir | /tmp | 臨時目錄,確保 PHP-FPM 用戶可寫、空間足夠、權限 1777 |
client intended to send too large body → 調大 client_max_body_size。request_terminate_timeout 或 fastcgi_request_buffering 相關錯誤。POST Content-Length of xxx bytes exceeds the limit → 調大 post_max_size。ls -ld /tmp 確認 drwxrwxrwt;PHP-FPM 進程用戶 (通常 www-data) 能在該目錄建檔。df -h /tmp 確保臨時分區剩餘 > 上傳檔案大小 2 倍。upload_max_filesize 不改 post_max_size → 仍報 413。memory_limit 小於 post_max_size → 大檔處理時 OOM。systemctl reload php-fpm)。client_body_temp_path 指向無寫權限目錄 → 上傳靜默失敗或 500。依「桶理論」逐層放寬限制,並確保臨時目錄權限與空間,即可徹底解決 Nginx + PHP-FPM 上傳難題。