Puma报NoMethodError:headers为nil但env中存在正常请求头
Puma 突发
undefined method 'each' for nil:NilClass 报错排查记录 故障表现
- 两套独立部署的应用分别使用 Puma 4.3.4、Puma 5.6.4 版本,此前服务长期正常运行,近期突发相同报错,错误日志输出如下:
Read error: #<NoMethodError: undefined method `each' for nil:NilClass>
- 两个版本的日志输出存在差异:Puma 5.6.4 未打印错误回溯栈,Puma 4.3.4 的报错栈直接定位到
/usr/local/bundle/gems/puma-4.3.4/lib/puma/server.rb:759行,对应逻辑为Puma执行headers.each遍历响应头的代码段。
已完成排查动作与结论
- 通过Pry在报错位置插入断点调试,确认触发报错时
headers变量确实为nil,暂未定位到导致headers为空的直接诱因。 - 检查请求上下文的
env对象,可正常读取到HTTP_HOST、HTTP_COOKIE等所有预期传入的请求头,暂无法解释Puma在handle_request前置处理阶段无法正常组装headers对象的原因。 - 排除前置代理影响:应用部署在包含反向代理的docker-compose环境中,但进入容器内部直接访问Puma监听端口仍能复现相同报错;如果是代理侧剥离请求头,
env对象中不会留存对应的头字段,因此该可能性不成立。 - 排除版本特定bug影响:将运行Puma 4.3.4的故障实例升级到5.6.4版本后故障未消失,和前期预判一致——原生运行5.6.4版本的应用本身就存在相同故障,只是因为该版本未输出对应回溯栈,暂时无法100%确认两个版本的故障触发点完全一致。
- 排除上层框架影响:涉事应用均基于Sinatra开发,但报错触发时请求还未流转到Sinatra框架处理层,因此框架本身不是故障诱因。
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

