阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Nginx配置之client_max_body_size和client_body_buffer_size

250次阅读
没有评论

共计 1384 个字符,预计需要花费 4 分钟才能阅读完成。

最近生产环境在这两个参数之间遇到过几次坑。这里记录下。

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 相同的值,这样就不会存储临时文件,直接存储在内存了。

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-21发表,共计1384字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中