【openresty】大请求中 ngx.req.get_body_data() 返回nil的解决方法

针对netstub项目中Lua脚本无法获取大Body数据的问题,本文介绍了解决方案,包括调整client_body_buffer_size设置及从临时文件读取数据的方法。

背景:

netstub项目中,后端的lua脚本中使用ngx.req.get_body_data获取请求body中的数据,使用过程中发现,当请求的body数据较大时,nginx会报错,发现ngx.req.get_body_data() 返回的数据是nil。

原因:

 当请求体大于client_body_buffer_size的时候,nginx会将数据保存到一个临时文件里。

解决方法:

①  配置client_body_buffer_size参数,将其改大,如100k

② 当get_body_data返回为nil时, 尝试从file中读取

新建utils.lua文件

utils = {}


local function read_from_file(file_name)
    local f = assert(io.open(file_name, "r"))
    local string = f:read("*all")
    f:close()
    return string
end


function utils.get_body_data()
    local body_raw = ngx.req.get_body_data()
    if not body_raw then
        local body_file = ngx.req.get_body_file()
        if body_file then
            body_raw = read_from_file(body_file)
        end
    end
    return body_raw
end


return utils

lua脚本中, 使用utils.get_body_data() 替换原生ngx.req.get_body_data()即可读取到大body的数据.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值