1. 程式人生 > 實用技巧 >【題解】P6329 【模板】點分樹 | 震波

【題解】P6329 【模板】點分樹 | 震波

總結:

  傳輸的資料大於client_max_body_size,一定是傳不成功的。小於client_body_buffer_size直接在記憶體中高效儲存。如果大於client_body_buffer_size小於client_max_body_size會儲存臨時檔案,臨時檔案一定要有許可權。
  如果追求效率,就設定 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)