| 層級 | 參數 | 預設值 | 建議值 (30MB 範例) | 說明 |
|---|---|---|---|---|
| Nginx | client_max_body_size | 1m | 30m | HTTP 請求體最大值,超過直接 413 |
| PHP | upload_max_filesize | 2M | 30M | 單一檔案上傳上限 |
| PHP | post_max_size | 8M | 35M | POST 總資料上限,**必須 > upload_max_filesize** |
# nginx.conf http 區塊 (全域生效)
http {
client_max_body_size 30m;
client_body_timeout 300s; # 上傳超時,大檔案需調大
client_body_buffer_size 128k; # 緩衝區,大檔案可調至 1m
...
}
# 或 server/location 區塊 (精細控制)
server {
location /upload/ {
client_max_body_size 100m; # 僅上傳介面放寬
}
}
file_uploads = On
upload_tmp_dir = /var/tmp/php_upload # 獨立分區、足夠空間、權限正確
upload_max_filesize = 30M
post_max_size = 35M
max_execution_time = 600 # 腳本執行上限秒數
max_input_time = 600 # 接收資料上限秒數
memory_limit = 128M # 腳本記憶體上限,大檔案處理需足夠
; 建議:啟用 OPcache 加速
opcache.enable=1
opcache.memory_consumption=128
# 編譯時加入 --add-module=../ngx_http_upload_module
location /upload {
upload_pass /php/merge_handler.php;
upload_store /var/tmp/nginx_upload 1 2;
upload_store_access user:rw;
upload_set_form_field $upload_field_name.name "$upload_file_name";
upload_set_form_field $upload_field_name.path "$upload_tmp_path";
upload_aggregate_form_field "$upload_field_name.md5" "$upload_file_md5";
upload_pass_form_field "^submit$|^description$";
upload_cleanup 400 404 499 500-505;
}
優點:Nginx 層面直接處理上傳、不佔用 PHP Worker、高併發極致效能
client_max_body_size 寫在 http 而非 server,被預設值覆蓋post_max_size < upload_max_filesize 導致大檔案截斷upload_tmp_dir 磁碟空間不足 / 權限錯誤 (需 www-data 可寫)request_terminate_timeout 過小,大檔案上傳中被殺enctype="multipart/form-data"# 建立 30MB 測試檔
dd if=/dev/zero of=test_30m.bin bs=1M count=30
# curl 上傳測試
curl -X POST -F "file=@test_30m.bin" https://example.com/upload.php -v
# 觀察:Content-Length、100 Continue、最終回應碼