Traefik v2.9.6缓冲中间件未返回HTTP 413,如何替换响应?
问题解决:Traefik缓冲中间件触发限制时返回连接重置而非413响应
问题原因
当Traefik的buffering中间件检测到请求体超过maxRequestBodyBytes限制时,如果客户端仍在持续发送数据,Traefik默认会直接关闭TCP连接,导致客户端收到"Connection reset by peer"错误,而非预期的HTTP 413响应。这是因为Traefik未在内存中缓冲足够的请求体数据,无法在断开连接前完成HTTP响应的发送。
解决方案
1. 调整缓冲中间件配置,添加内存缓冲参数
修改request-limits中间件,增加memRequestBodyBytes参数,设置为与maxRequestBodyBytes相同的值(或合理的内存缓冲阈值),让Traefik先将请求体缓冲到内存中,这样在检测到大小超限后,能正常发送413响应再关闭连接:
apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: request-limits spec: buffering: maxRequestBodyBytes: 10485760 memRequestBodyBytes: 10485760 # 配置内存缓冲上限,与请求体限制一致
2. 优化Entrypoint超时配置
确保Traefik的websecure入口点有足够的超时时间,让Traefik能完成413响应的发送:
在Traefik的ConfigMap配置中添加:
entryPoints: websecure: http: timeout: requestTimeout: 30s
3. 分块编码请求的额外处理
如果客户端使用分块编码传输请求体,Traefik无法提前预知总大小,会在接收过程中检测超限。此时上述配置仍能生效,Traefik会在检测到超限后立即发送413响应,而非直接重置连接。
验证
更新中间件和Traefik配置后,重新发送超过10MiB的请求,此时应收到标准的HTTP 413 "Payload Too Large"响应,而非连接重置错误。
内容的提问来源于stack exchange,提问作者Theo Sweeny
相关产品推荐
相关产品推荐

