Nginx系列 | [轉]Nginx 上傳文件:client_max_body_size 、client_body_buffer_size

原文:http://php-note.com/article/detail/488

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,必定是失敗的。若是須要上傳大文件,必定要修改該值。php

client_body_buffer_size

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)

總結

  • 傳輸的數據大於 client_max_body_size,必定是傳不成功的。
  • 小於 client_body_buffer_size直接在內存中高效存儲。
  • 若是大於 client_body_buffer_size 小於 client_max_body_size 會存儲臨時文件,臨時文件必定要有權限。
  • 若是追求效率,就設置 client_max_body_size 和 client_body_buffer_size 相同的值,這樣就不會存儲臨時文件,直接存儲在內存了。
相關文章
相關標籤/搜索