express-http-proxy设置transfer-encoding:chunked时重置连接问题排查
问题排查与解决:express-http-proxy处理chunked请求时的504超时问题
问题现象
使用express-http-proxy将example.com的请求代理至def.com,常规请求正常,但携带transfer-encoding: chunked头的请求会被立即重置连接,返回504网关超时,响应头带有x-timeout-reason: express-http-proxy reset the request。
原因分析
- 请求体解析逻辑冲突:express-http-proxy默认会等待完整接收请求体后再转发至目标服务器,但chunked编码的请求是流式分块传输,没有固定的Content-Length,代理会因超时等待完整请求体触发连接重置。
- 旧版本流式转发bug:低版本的express-http-proxy在处理chunked请求时,未正确实现流式数据的传递逻辑,导致分块数据无法正常转发,进而触发超时机制。
解决方法
升级express-http-proxy至最新版本
新版本修复了chunked请求的流式处理bug,执行命令完成升级:npm update express-http-proxy禁用请求体解析
配置parseReqBody为false,强制代理不解析请求体,直接流式转发原始分块数据,避免等待完整请求体:var proxy = require('express-http-proxy'); var app = require('express')(); app.use('/proxy', proxy('https://def.com', { parseReqBody: false }));调整代理超时时间(可选)
如果升级和禁用解析后仍存在超时,可通过timeout选项延长代理等待时长(单位:毫秒):app.use('/proxy', proxy('https://def.com', { parseReqBody: false, timeout: 30000 // 设置为30秒 }));
内容的提问来源于stack exchange,提问作者RKodakandla
相关产品推荐
相关产品推荐

