ELB HTTP监听器访问慢的问题

【故障类型】:访问慢
【关 键 词】:HTTP/1.1 HTTP/1.0
【适用场景】:
【案例作者】:
【问题现象】:经ELB访问后端服务变慢,经客户自己的反向代理Nginx访问正常
【问题结论】:浏览器默认限制单个域名的长链接数量为6条;网页请求完资源后挥手不及时,等了20s
【排查步骤】:
问题现象:先开始6个请求,等待20s结束了再开始6个请求。(Firefox Chrome等浏览器默认一个域名的长链接数最大为6)
image.png

具体到一条流,资源已经请求完了,服务端却要等待20s才释放连接:
image.png

通过客户的反向代理访问,发现Nginx到后端是HTTP/1.0协议(HTTP/1.0:如果不声明connection:keep-alive,则默认短链接)
image.png
HTTP传输完成,由服务端151IP立刻发起挥手。

原因已经清晰了:由于客户端和ELB-nginx发起的都是HTTP/1.1请求(HTTP/1.1: TCP连接默认不关闭),导致长链接没有关闭,后续的请求被阻塞着直到服务端超时释放长链接。

HTTP/1.1 持久连接:
客户端和服务器发现对方一段时间没有活动,就可以主动关闭连接。不过,规范的做法是,客户端在最后一个请求时,发送Connection: close,明确要求服务器关闭TCP连接。

解决办法:
设置后端Tomcat配置文件server.xml里的 maxKeepAliveRequests="1",即一个tcp连接只负载一条HTTP请求就被关闭,相当于强制变短链接。

<Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               maxKeepAliveRequests="1" />

TODO

解释为什么客户端没用好HTTP/1.1的管道功能,让后续的请求阻塞在那里。


HTTP 协议入门 https://www.ruanyifeng.com/blog/2016/08/http.html
Tomcat 调优及 JVM 参数优化 https://www.cnblogs.com/baihuitestsoftware/articles/6483690.html

posted @ 2021-04-26 15:17  Jneeee  阅读(157)  评论(0编辑  收藏  举报