影響 POST 請求檔案上傳失敗的幾個環節的配置(php + nginx)
阿新 • • 發佈:2018-12-21
寫在前面
最近寫一個 php 介面,接受上傳的檔案,發現檔案只要超過 5m 以上就會無響應失敗,最後發現是 shadowsocks 的 timeout 設定問題(我全程開了全域性的 VPN),但一開始並不知曉,把 nginx 和 php 的相關配置都看了個遍,乾脆記錄一下,以後遇到此類問題可以按照這個邏輯順序去排查。
零、環境
PHP Version 7.0.10
一、php
通過修改 php.ini
:
1、上傳相關
options | type | desc | remark |
---|---|---|---|
file_uploads | boolean | 是否允許 HTTP 檔案上傳 | 'On' or 'Off' |
upload_tmp_dir | string | 上傳時儲存檔案的臨時目錄。 | 如果未指定,將使用系統的預設值(/tmp)。 |
upload_max_filesize | integer | 上傳檔案的最大大小。 | 是所有檔案欄位的大小總和。 |
post_max_size | integer | post_max_size = upload_max_filesize + 所有其他欄位的長度(跟檔案比微不足道) | post_max_size 一般略大於upload_max_filesize,但為了省事可以直接讓它們相等。 |
max_file_uploads | integer | 允許同時上傳的最大檔案數。(提交時保留空白的上傳欄位不計入此限制) |
注:
upload_max_filesize
和post_max_size
可以用速記表達:K (for Kilobytes), M (for Megabytes) and G (for Gigabytes; available since PHP 5.1.0) ,不區分大小寫。
2、時間相關
options | type | desc | remark |
---|---|---|---|
max_input_time | integer | 指令碼解析輸入資料允許的最大時間,單位是秒。 它從接收所有資料到開始執行指令碼進行測量的。 | |
max_execution_time | integer | 這設定了指令碼被解析器中止之前允許的最大執行時間,單位秒。 這有助於防止寫得不好的指令碼佔盡伺服器資源。 | 你的 web 伺服器也可以有其他超時設定。 |
先
max_input_time
再max_execution_time
。
3、記憶體相關
options | type | desc | remark |
---|---|---|---|
memory_limit | integer | 這將設定允許指令碼分配的最大記憶體量(以位元組為單位)。這有助於防止編寫糟糕的指令碼佔用伺服器上的所有可用記憶體。 | 要沒有記憶體限制,請將此指令設定為-1。 |
二、nginx
通過修改 nginx.conf
:
options | type | desc | remark |
---|---|---|---|
client_max_body_size | integer |
返回 413(請求實體太大)錯誤。
三、shadowsocks
通過修改 preferences
:
options | type | desc | remark |
---|---|---|---|
timeout |
integer | 超時時間 |
返回 net::ERR_CONNECTION_RESET 錯誤。