nginx keepalive_timeout、AWS ELB idle_timeout与proxy_read_timeout作用疑问
Nginx keepalive_timeout在该链路中的作用说明
核心作用
你提到的Nginx默认70秒的keepalive_timeout,作用于AWS ELB与Nginx之间的长连接,具体生效逻辑如下:
- 仅针对没有任何活跃请求的空闲长连接生效:当ELB和Nginx之间的连接连续70秒没有任何数据收发时,Nginx会主动关闭这条空闲连接
- 该参数和你配置的
proxy_read_timeout完全独立:proxy_read_timeout管控的是Nginx等待后端返回响应的最大间隔,只要后端每5分钟内有数据返回,就算ELB和Nginx之间的连接持续处于数据传输状态超过70秒,也不会被keepalive_timeout中断
当前配置的风险
根据AWS的规则要求,ELB的idleTimeout必须小于后端服务的长连接空闲超时,目的是避免ELB认为连接存活、但后端已经主动关闭连接的情况。你当前配置中ELB idleTimeout为6分钟(360秒),远大于Nginx的70秒keepalive_timeout,会触发如下问题:
- 当ELB尝试复用已经被Nginx主动关闭的空闲连接转发请求时,会收到Nginx的RST重置包,直接返回504网关超时错误,该错误和后端是否在正常处理请求无关
- 即使是处理短耗时请求,只要连接空闲超过70秒后被ELB复用,就有概率触发上述报错
修复建议
将Nginx侧的keepalive_timeout调整为大于ELB idleTimeout即可,比如设置为7分钟(420秒),既符合AWS规则,也不会影响你为长耗时请求配置的5分钟proxy_read_timeout规则。
内容的提问来源于stack exchange,提问作者Haneef Ali
相关产品推荐
相关产品推荐

