post请求体过大导致ngx.req.get_post_args()取不到参数体的问题
http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size
该地址对于client_body_buffer_size配置做了说明
syntax: client_body_buffer_size size
default: client_body_buffer_size 8k|16k
context: http,server,location
Sets buffer size for reading client request body. In case the request body is larger than the buffer, the whole body or only its part is written to a temporary file. By default, buffer size is equal to two memory pages. This is 8K on x86, other 32-bit platforms, and x86-64. It is usually 16K on other 64-bit platforms.
为读取客户端请求体设置缓存区大小。为了防止请求体超过缓存区大小,将整个请求体或其中一分部写入一个临时文件。默认缓存区大小为two memory pages。在x86、32位机器、x86-64上是8k,其它64位机器上是16k。
解决方案有两种:
1、调大client_body_buffer_size值
client_body_buffer_size 128k
client_max_body_size 100m
这两个参数配合使用,如果总body_size超过这个值,请求会被拒绝
2、去临时文件读取请求体
需要用到ngx.req.get_body_file,从临时文件读取数据
- --Nginx服务器中使用lua获取get或post参数
- local request_method = ngx.var.request_method
- local args = nil
- local param = nil
- local param2 = nil
- --获取参数的值
- if "GET" == request_method then
- args = ngx.req.get_uri_args()
- elseif "POST" == request_method then
- ngx.req.read_body()
- args = ngx.req.get_post_args()
- end
- param = args["param"]
- param2 = args["param2"]
- --升级版(能处理content-type=multipart/form-data的表单):
- local function explode ( _str,seperator )
- local pos, arr = , {}
- for st, sp in function() return string.find( _str, seperator, pos, true ) end do
- table.insert( arr, string.sub( _str, pos, st- ) )
- pos = sp +
- end
- table.insert( arr, string.sub( _str, pos ) )
- return arr
- end
- local args = {}
- local file_args = {}
- local is_have_file_param = false
- local function init_form_args()
- local receive_headers = ngx.req.get_headers()
- local request_method = ngx.var.request_method
- if "GET" == request_method then
- args = ngx.req.get_uri_args()
- elseif "POST" == request_method then
- ngx.req.read_body()
- --判断是否是multipart/form-data类型的表单
- if string.sub(receive_headers["content-type"],,) == "multipart/form-data;" then
- is_have_file_param = true
- content_type = receive_headers["content-type"]
- --body_data可是符合http协议的请求体,不是普通的字符串
- body_data = ngx.req.get_body_data()
- --请求体的size大于nginx配置里的client_body_buffer_size,则会导致请求体被缓冲到磁盘临时文件里,client_body_buffer_size默认是8k或者16k
- if not body_data then
- local datafile = ngx.req.get_body_file()
- if not datafile then
- error_code =
- error_msg = "no request body found"
- else
- local fh, err = io.open(datafile, "r")
- if not fh then
- error_code =
- error_msg = "failed to open " .. tostring(datafile) .. "for reading: " .. tostring(err)
- else
- fh:seek("set")
- body_data = fh:read("*a")
- fh:close()
- if body_data == "" then
- error_code =
- error_msg = "request body is empty"
- end
- end
- end
- end
- local new_body_data = {}
- --确保取到请求体的数据
- if not error_code then
- local boundary = "--" .. string.sub(receive_headers["content-type"],)
- local body_data_table = explode(tostring(body_data),boundary)
- local first_string = table.remove(body_data_table,)
- local last_string = table.remove(body_data_table)
- for i,v in ipairs(body_data_table) do
- local start_pos,end_pos,capture,capture2 = string.find(v,'Content%-Disposition: form%-data; name="(.+)"; filename="(.*)"')
- --普通参数
- if not start_pos then
- local t = explode(v,"rnrn")
- local temp_param_name = string.sub(t[],,-)
- local temp_param_value = string.sub(t[],,-)
- args[temp_param_name] = temp_param_value
- else
- --文件类型的参数,capture是参数名称,capture2是文件名
- file_args[capture] = capture2
- table.insert(new_body_data,v)
- end
- end
- table.insert(new_body_data,,first_string)
- table.insert(new_body_data,last_string)
- --去掉app_key,app_secret等几个参数,把业务级别的参数传给内部的API
- body_data = table.concat(new_body_data,boundary)--body_data可是符合http协议的请求体,不是普通的字符串
- end
- else
- args = ngx.req.get_post_args()
- end
- end
- end
post请求体过大导致ngx.req.get_post_args()取不到参数体的问题的更多相关文章
- application/x-www-form-urlencoded 的contentType,POST数据内容过大,导致tomcat的request取不到参数
如题, 可通过设置tomcat的connector的参数 server.xml中的connector中加上属性 maxPostSize="20971520" maxPostSize ...
- nginx的 ngx.var ngx.ctx ngx.req
ngx.var 是获取 Nginx 的变量,需要经历字符串 hash.hash 表查找等过程. ngx.ctx 仅仅是一个 Lua table 而已,它的引用存放在 ngx_lua 的模块上下文(ct ...
- 【原创】大叔问题定位分享(36)openresty(nginx+lua)中获取不到post数据,ngx.req.get_body_data返回nil
openresty(nginx+lua)中获取不到post数据,ngx.req.get_body_data返回nil This function returns nil if the request ...
- 转 listener.log文件过大导致oracle数据库连接非常慢
数据库(31) 最近发现oracle数据库连接非常慢,sqlplus很快,用客户端就很慢,甚至会无响应. 然后服务器内存一下就飙升到了90%,不是表空间占满了,也不是数据库连接数占满了.重启还是一样 ...
- 分享工作中遇到的问题积累经验 事务日志太大导致insert不进数据
分享工作中遇到的问题积累经验 事务日志太大导致insert不进数据 今天开发找我,说数据库insert不进数据,叫我看一下 他发了一个截图给我 然后我登录上服务器,发现了可疑的地方,而且这个数据库之前 ...
- 解决父类加载iframe,src参数过大导致加载失败
原文:解决父类加载iframe,src参数过大导致加载失败 <iframe src="*******.do?param=****" id="leftFrame&qu ...
- Oracle 监听器日志文件过大导致监听异常
Oracle 监听器日志文件过大导致监听异常 db版本:11.2.0.1 os版本:windows2008 现象: 应用异常,无法连接数据库.登陆数据库服务器,查看监听已经断掉.尝试重启监听,重启失败 ...
- Tomcat请求头过大
今天开发反应Tomcat的请求头过大 <Connector port="8280" protocol="HTTP/1.1" connectionTimeo ...
- listener.log文件过大导致oracle假死
/home/u01/oracle/product/11gr2/db_1/log/diag/tnslsnr/VM_179_95_centos/listener/trace/listener.log li ...
随机推荐
- Windows Server 2008R2常见的500错误
每次公司服务器装系统后再去部署服务,都会碰到这个问题,这里记录一下问题的解决方法 遇到“500 – 内部服务器错误. 您查找的资源存在问题,因而无法显示.”的问题. 解决办法: 1.解决方法:打开II ...
- python变量作用域,函数与传参
一.元组传值: 一般情况下函数传递参数是1对1,这里x,y是2个参数,按道理要传2个参数,如果直接传递元祖,其实是传递一个参数 >>> def show( x, y ): ... p ...
- Mysql实现级联操作(级联更新、级联删除)
一.首先创建两张表stu,sc create table stu( sid int UNSIGNED primary key auto_increment, name ) not null) TYPE ...
- js 事件委托代理
在优化网页性能的技巧当中,对DOM的优化是必不可少的.这其中就涉及到了javascript对DOM的频繁操作.比如响应用户操作的事件.一般情况下,如果是稍微初级一点的前端程序员,在拿到项目的时候,对待 ...
- ionic 项目下 有时候发现select标签用动态数据绑定后点击出不来的情况
一 第一种方法 在select 标签的父标签加上 data-tap-disabled=”true” 二 找到 ionic.bundle.js文件 下边有个方法 function tapIgnoreE ...
- 前后端分离(手) -- mock.js
前言: 本篇博文昨天七夕写的,一天下来被虐得体无完肤,苦逼的单身狗只能学习,对!我爱学习,关掉朋友圈,并写了一篇博文发泄发泄.这次写mock.js的使用,能使前后端分离,分离,分离,重要的是说三遍. ...
- 活字格Web应用平台学习笔记1 - 下载安装,ready go
今年有一个很重要的职业目标,就是好好学习活字格这个神器,争取在这两个月拿到活字格初级工程师的认证证书.给自己加个油,今天开始好好学习,好好做笔记. 第一步,下载安装 先去活字格官网:http://ww ...
- Angular调用父Scope的函数
app.directive('toggle', function(){ return { restrict: 'A', template: '<a ng-click="f()" ...
- 双启动:安装Windows 7 和 CentOS 7 双系统教程
笔记本配置:8G内存,200G SSD,先在virbox中成功安装双系统,能正常进入并使用 Windows 7 和 CentOS 7. 网上看到一大堆的安装 wingrub easyBCD,折腾了一 ...
- ecsop文件结构
Ecshop文件结构 :ecshop二次开发手册,ECSHOP文件结构,ECSHOP目录详解 /*ECShop 最新程序 的结构图及各文件相应功能介绍ECShop文件结构目录┣ activity.ph ...