Nginx配置之client_max_body_size和client_body_buffer_size
最近生產環境在這兩個引數之間遇到過幾次坑。這裡記錄下。
client_max_body_size
client_max_body_size 預設 1M,表示 客戶端請求伺服器最大允許大小,在“Content-Length”請求頭中指定。如果請求的正文資料大於client_max_body_size,HTTP協議會報錯 413 Request Entity Too Large。就是說如果請求的正文大於client_max_body_size,一定是失敗的。如果需要上傳大檔案,一定要修改該值。
client_body_buffer_size
Nginx分配給請求資料的Buffer大小,如果請求的資料小於client_body_buffer_size直接將資料先在記憶體中儲存。如果請求的值大於client_body_buffer_size小於client_max_body_size,就會將資料先儲存到臨時檔案中,在哪個臨時檔案中呢?
client_body_temp 指定的路徑中,預設該路徑值是/tmp/.
所以配置的client_body_temp地址,一定讓執行的Nginx的使用者組有讀寫許可權。否則,當傳輸的資料大於client_body_buffer_size,寫進臨時檔案失敗會報錯。
這個問題我們遇到過。
20648 open() "/usr/local/openresty-1.9.7.5/nginx/client_body_temp/0000000019" failed (13: Permission denied)
/usr/local/openresty-1.9.7.5/nginx/client_body_temp/這個資料夾許可權改為執行Nginx的使用者群組就可以解決。
在這個問題上和語言就相關了,如果使用的是PHP,PHP會自己將臨時檔案讀取出來,放置到請求資料裡面,這是沒有問題的,開發者也不需要關心。肯定是完整的資料。
如果使用的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)
總結
傳輸的資料大於client_max_body_size,一定是傳不成功的。小於client_body_buffer_size直接在記憶體中高效儲存。如果大於client_body_buffer_size小於client_max_body_size會儲存臨時檔案,臨時檔案一定要有許可權。
如果追求效率,就設定 client_max_body_size client_body_buffer_size相同的值,這樣就不會儲存臨時檔案,直接儲存在記憶體了。
Linux公社的RSS地址 :https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址:https://www.linuxidc.com/Linux/2019-03/157395.htm