最近在做的两个功能都需要对request body进行读取处理,好在OpenResty提供了相关函数,这里简单记一下。
获取request body
ngx.req.get_body_data
官方文档:https://github.com/openresty/lua-nginx-module#ngxreqget_body_data
简单说这个函数是获取内存中request body。获取成功时它会返回string类型的request body(如果需要table形式的请求参数可以使用ngx.req.get_post_args()函数);获取失败时返回nil,返回nil可能是以下原因造成的:
- request body没有被读入;
- request body已被写入临时文件(temporary file);
- 没有request body(request body大小为0)。
因为Nginx默认不会读取request body,所以为保证可以如期的获取到,我们最好先请求ngx.req.read_body()函数(或者打开lua_need_request_body开关强制读取request body。PS:不建议这样做),再去请求ngx.req.get_body_data();当request body已被写入临时文件时,我们需要通过ngx.req.get_body_file()函数来获取request body。
ngx.req.get_body_file
官方文档:https://github.com/openresty/lua-nginx-module#ngxreqget_body_file
这个函数和上面ngx.req.get_body_data相似,但是是用来获取临时文件中request body的。当还没有读取request body或request body在内存中时会返回nil。
这里需要注意的一件事是这时读出来的数据是只读的,不可以再在Lua代码中进行手工的modified、rename、remote。
Nginx的几个重要配置
讲到这里,感觉前面好像错过了什么重要的细节……对,就是request body到底在哪里?什么时候在内存,什么时候在临时文件?说到这个就需要去翻一下Nginx的文档啦~
client_max_body_size
首先先来看下client_max_body_size,这个参数设置了被允许的最大的request body大小,当一个request超过这个值的时候将会返回413错误(Request Entity Too Large)。如果不需要检查request body的大小将此值置为0即可。
client_body_buffer_size
再来看下client_body_buffer_size,这个参数设置了读取request body的buffer大小(默认值是两个内存页的大小,8k|16k)。当request body大于这个值时就会写在临时文件中。
好了,前面的疑惑解决了,但是还有两个问题:如何让request body只在内存或者临时文件中呢?
强制使用内存存request body
前面讲了client_max_body_size和client_body_buffer_size两个参数,其实将client_body_buffer_size设为client_max_body_size的大小就可以强制把request body放在内存中了。
强制使用临时文件存request body
Nginx配置中有个client_body_in_file_only参数(详见这里),开启后就强制把request body放在临时文件中了。
最后
好了,文章戛然而止,没有“最后”……
点击数:1211