client_max_body_size 默認 1M,表示 客戶端請求服務器最大容許大小,在「Content-Length」請求頭中指定。若是請求的正文數據大於client_max_body_size,HTTP協議會報錯 413 Request Entity Too Large。就是說若是請求的正文大於client_max_body_size,必定是失敗的。若是須要上傳大文件,必定要修改該值。php
Nginx分配給請求數據的Buffer大小,若是請求的數據小於client_body_buffer_size直接將數據先在內存中存儲。若是請求的值大於client_body_buffer_size小於client_max_body_size,就會將數據先存儲到臨時文件中,在哪一個臨時文件中呢?nginx
client_body_temp 指定的路徑中,默認該路徑值是/tmp/。bash
因此配置的client_body_temp地址,必定讓執行的Nginx的用戶組有讀寫權限。不然,當傳輸的數據大於client_body_buffer_size,寫進臨時文件失敗會報錯。服務器
這個問題咱們遇到過。lua
20648 open() "/usr/local/openresty-1.9.7.5/nginx/client_body_temp/0000000019" failed (13: Permission denied)spa
/usr/local/openresty-1.9.7.5/nginx/client_body_temp/這個文件夾權限改成執行Nginx的用戶羣組就能夠解決。rest
在這個問題上和語言就相關了,若是使用的是PHP,PHP會本身將臨時文件讀取出來,放置到請求數據裏面,這是沒有問題的,開發者也不須要關心。確定是完整的數據。blog
若是使用的openresty lua 開發的話,就須要開發者本身讀取出來,讓後續的邏輯使用。內存
function getFile(file_name)
local f = assert(io.open(file_name, 'r'))
local string = f:read("*all")
f:close()
return string
end
ngx.req.read_body()
local data = ngx.req.get_body_data()
if nil == data then
local file_name = ngx.req.get_body_file()
ngx.say(">> temp file: ", file_name)
if file_name then
data = getFile(file_name)
end
end
ngx.say("hello ", data)