ZBLOG

ngx.req.read_body() local f = io.open("/emm/1.txt","w") f:write(ngx.req.get_body_data()) f:close() return ngx.ext(200) 读取出来的数据为nil如何解决?

你的代码中 ngx.req.get_body_data() 返回 nil 的原因及解决方案如下:


问题原因

  1. 未正确配置 client_body_buffer_size
    OpenResty 默认会将小请求体(<16KB)放在内存,大请求体会写入临时文件。如果请求体大小超过缓冲区但未正确配置,会导致数据无法读取。

  2. 未设置 client_max_body_size
    Nginx 默认限制请求体大小为 1MB,超过会直接丢弃数据。

  3. 重复调用 ngx.req.read_body()
    多次调用可能导致状态异常(但你的代码中没有这个问题)。

  4. 请求头缺失或错误
    如缺少 Content-LengthTransfer-Encoding: chunked


修正后的代码

  1. -- 1. 必须优先读取body
  2. ngx.req.read_body()
  3. -- 2. 获取内存中的数据
  4. local body_data = ngx.req.get_body_data()
  5. if not body_data then
  6. -- 3. 检查是否被写入临时文件
  7. local tmp_file = ngx.req.get_body_file()
  8. if tmp_file then
  9. local f = io.open(tmp_file, "rb")
  10. if f then
  11. body_data = f:read("*a")
  12. f:close()
  13. end
  14. end
  15. end
  16. -- 4. 处理数据不存在的情况
  17. if not body_data then
  18. ngx.log(ngx.ERR, "Failed to read request body")
  19. return ngx.exit(400)
  20. end
  21. -- 5. 写入目标文件(注意用二进制模式)
  22. local out_file = io.open("/emm/1.txt", "wb") -- 'b'模式避免编码问题
  23. if out_file then
  24. out_file:write(body_data)
  25. out_file:close()
  26. else
  27. ngx.log(ngx.ERR, "Failed to open output file")
  28. return ngx.exit(500)
  29. end
  30. return ngx.exit(200)

关键配置(nginx.conf)

  1. http {
  2. # 调整缓冲区大小(根据需求设置)
  3. client_body_buffer_size 100k;
  4. # 允许的最大请求体大小(必要!)
  5. client_max_body_size 10m;
  6. # 临时文件目录权限(确保OpenResty有写入权限)
  7. client_body_temp_path /tmp/nginx_client_temp;
  8. }

调试建议

  1. 检查请求头

    1. curl -v -X POST -d 'test=123' http://your_server/path

  2. 查看Nginx日志

    1. tail -f /usr/local/openresty/nginx/logs/error.log | grep lua
  3. 验证文件权限

    1. mkdir -p /emm && chown -R nobody:nobody /emm

    (假设OpenResty以nobody用户运行)


如果仍有问题,可能是上游服务器提前关闭了连接,可以在Nginx配置中添加:

  1. proxy_request_buffering off;
  2. fastcgi_request_buffering off;

具体可参考零声教育《OpenResty核心编程》第6章内容。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23289

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?