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,从临时文件读取数据

  1. --Nginx服务器中使用lua获取getpost参数
  2. local request_method = ngx.var.request_method
  3. local args = nil
  4. local param = nil
  5. local param2 = nil
  6. --获取参数的值
  7. if "GET" == request_method then
  8. args = ngx.req.get_uri_args()
  9. elseif "POST" == request_method then
  10. ngx.req.read_body()
  11. args = ngx.req.get_post_args()
  12. end
  13. param = args["param"]
  14. param2 = args["param2"]
  15. --升级版(能处理content-type=multipart/form-data的表单):
  16. local function explode ( _str,seperator )
  17. local pos, arr = , {}
  18. for st, sp in function() return string.find( _str, seperator, pos, true ) end do
  19. table.insert( arr, string.sub( _str, pos, st- ) )
  20. pos = sp +
  21. end
  22. table.insert( arr, string.sub( _str, pos ) )
  23. return arr
  24. end
  25. local args = {}
  26. local file_args = {}
  27. local is_have_file_param = false
  28. local function init_form_args()
  29. local receive_headers = ngx.req.get_headers()
  30. local request_method = ngx.var.request_method
  31. if "GET" == request_method then
  32. args = ngx.req.get_uri_args()
  33. elseif "POST" == request_method then
  34. ngx.req.read_body()
  35. --判断是否是multipart/form-data类型的表单
  36. if string.sub(receive_headers["content-type"],,) == "multipart/form-data;" then
  37. is_have_file_param = true
  38. content_type = receive_headers["content-type"]
  39. --body_data可是符合http协议的请求体,不是普通的字符串
  40. body_data = ngx.req.get_body_data()
  41. --请求体的size大于nginx配置里的client_body_buffer_size,则会导致请求体被缓冲到磁盘临时文件里,client_body_buffer_size默认是8k或者16k
  42. if not body_data then
  43. local datafile = ngx.req.get_body_file()
  44. if not datafile then
  45. error_code =
  46. error_msg = "no request body found"
  47. else
  48. local fh, err = io.open(datafile, "r")
  49. if not fh then
  50. error_code =
  51. error_msg = "failed to open " .. tostring(datafile) .. "for reading: " .. tostring(err)
  52. else
  53. fh:seek("set")
  54. body_data = fh:read("*a")
  55. fh:close()
  56. if body_data == "" then
  57. error_code =
  58. error_msg = "request body is empty"
  59. end
  60. end
  61. end
  62. end
  63. local new_body_data = {}
  64. --确保取到请求体的数据
  65. if not error_code then
  66. local boundary = "--" .. string.sub(receive_headers["content-type"],)
  67. local body_data_table = explode(tostring(body_data),boundary)
  68. local first_string = table.remove(body_data_table,)
  69. local last_string = table.remove(body_data_table)
  70. for i,v in ipairs(body_data_table) do
  71. local start_pos,end_pos,capture,capture2 = string.find(v,'Content%-Disposition: form%-data; name="(.+)"; filename="(.*)"')
  72. --普通参数
  73. if not start_pos then
  74. local t = explode(v,"rnrn")
  75. local temp_param_name = string.sub(t[],,-)
  76. local temp_param_value = string.sub(t[],,-)
  77. args[temp_param_name] = temp_param_value
  78. else
  79. --文件类型的参数,capture是参数名称,capture2是文件名
  80. file_args[capture] = capture2
  81. table.insert(new_body_data,v)
  82. end
  83. end
  84. table.insert(new_body_data,,first_string)
  85. table.insert(new_body_data,last_string)
  86. --去掉app_key,app_secret等几个参数,把业务级别的参数传给内部的API
  87. body_data = table.concat(new_body_data,boundary)--body_data可是符合http协议的请求体,不是普通的字符串
  88. end
  89. else
  90. args = ngx.req.get_post_args()
  91. end
  92. end
  93. end

post请求体过大导致ngx.req.get_post_args()取不到参数体的问题的更多相关文章

  1. application/x-www-form-urlencoded 的contentType,POST数据内容过大,导致tomcat的request取不到参数

    如题, 可通过设置tomcat的connector的参数 server.xml中的connector中加上属性 maxPostSize="20971520" maxPostSize ...

  2. nginx的 ngx.var ngx.ctx ngx.req

    ngx.var 是获取 Nginx 的变量,需要经历字符串 hash.hash 表查找等过程. ngx.ctx 仅仅是一个 Lua table 而已,它的引用存放在 ngx_lua 的模块上下文(ct ...

  3. 【原创】大叔问题定位分享(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 ...

  4. 转 listener.log文件过大导致oracle数据库连接非常慢

    数据库(31)  最近发现oracle数据库连接非常慢,sqlplus很快,用客户端就很慢,甚至会无响应. 然后服务器内存一下就飙升到了90%,不是表空间占满了,也不是数据库连接数占满了.重启还是一样 ...

  5. 分享工作中遇到的问题积累经验 事务日志太大导致insert不进数据

    分享工作中遇到的问题积累经验 事务日志太大导致insert不进数据 今天开发找我,说数据库insert不进数据,叫我看一下 他发了一个截图给我 然后我登录上服务器,发现了可疑的地方,而且这个数据库之前 ...

  6. 解决父类加载iframe,src参数过大导致加载失败

    原文:解决父类加载iframe,src参数过大导致加载失败 <iframe src="*******.do?param=****" id="leftFrame&qu ...

  7. Oracle 监听器日志文件过大导致监听异常

    Oracle 监听器日志文件过大导致监听异常 db版本:11.2.0.1 os版本:windows2008 现象: 应用异常,无法连接数据库.登陆数据库服务器,查看监听已经断掉.尝试重启监听,重启失败 ...

  8. Tomcat请求头过大

    今天开发反应Tomcat的请求头过大 <Connector port="8280" protocol="HTTP/1.1" connectionTimeo ...

  9. listener.log文件过大导致oracle假死

    /home/u01/oracle/product/11gr2/db_1/log/diag/tnslsnr/VM_179_95_centos/listener/trace/listener.log li ...

随机推荐

  1. Windows Server 2008R2常见的500错误

    每次公司服务器装系统后再去部署服务,都会碰到这个问题,这里记录一下问题的解决方法 遇到“500 – 内部服务器错误. 您查找的资源存在问题,因而无法显示.”的问题. 解决办法: 1.解决方法:打开II ...

  2. python变量作用域,函数与传参

    一.元组传值: 一般情况下函数传递参数是1对1,这里x,y是2个参数,按道理要传2个参数,如果直接传递元祖,其实是传递一个参数 >>> def show( x, y ): ... p ...

  3. Mysql实现级联操作(级联更新、级联删除)

    一.首先创建两张表stu,sc create table stu( sid int UNSIGNED primary key auto_increment, name ) not null) TYPE ...

  4. js 事件委托代理

    在优化网页性能的技巧当中,对DOM的优化是必不可少的.这其中就涉及到了javascript对DOM的频繁操作.比如响应用户操作的事件.一般情况下,如果是稍微初级一点的前端程序员,在拿到项目的时候,对待 ...

  5. ionic 项目下 有时候发现select标签用动态数据绑定后点击出不来的情况

    一 第一种方法 在select 标签的父标签加上  data-tap-disabled=”true” 二 找到 ionic.bundle.js文件 下边有个方法 function tapIgnoreE ...

  6. 前后端分离(手) -- mock.js

    前言: 本篇博文昨天七夕写的,一天下来被虐得体无完肤,苦逼的单身狗只能学习,对!我爱学习,关掉朋友圈,并写了一篇博文发泄发泄.这次写mock.js的使用,能使前后端分离,分离,分离,重要的是说三遍. ...

  7. 活字格Web应用平台学习笔记1 - 下载安装,ready go

    今年有一个很重要的职业目标,就是好好学习活字格这个神器,争取在这两个月拿到活字格初级工程师的认证证书.给自己加个油,今天开始好好学习,好好做笔记. 第一步,下载安装 先去活字格官网:http://ww ...

  8. Angular调用父Scope的函数

    app.directive('toggle', function(){ return { restrict: 'A', template: '<a ng-click="f()" ...

  9. 双启动:安装Windows 7 和 CentOS 7 双系统教程

    笔记本配置:8G内存,200G SSD,先在virbox中成功安装双系统,能正常进入并使用 Windows 7 和 CentOS 7. 网上看到一大堆的安装 wingrub  easyBCD,折腾了一 ...

  10. ecsop文件结构

    Ecshop文件结构 :ecshop二次开发手册,ECSHOP文件结构,ECSHOP目录详解 /*ECShop 最新程序 的结构图及各文件相应功能介绍ECShop文件结构目录┣ activity.ph ...