最近在做的两个功能都需要对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可能是以下原因造成的:

  1. request body没有被读入;
  2. request body已被写入临时文件(temporary file);
  3. 没有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