【HTTP】http header 过大导致前端无法请求问题排查
在学习 HTTP 协议的时候,除了阅读 RFC2616 等 RFC 文档,还可以参考 MDN(Mozilla Developer Network),因为是有中文版的,所以对我们更加友好。
我们回到 HTTP 502 的语义本身,看看我们在说 502 的时候,我们说的到底是什么。
这是 RFC2616 中针对502 Bad Gateway所给出的定义:
502 Bad Gateway
The server, while acting as a gateway or proxy, received an invalid
response from the upstream server it accessed in attempting to fulfill the request.
作为网关或者代理的服务器,在试图从它的上游服务器(后端服务器)执行 HTTP 请求时,接收到了一个无效的响应。
云 LB认为,后端返回的 HTTP 响应并不符合它对于“有效”的定义。但是,显然后端回复的 HTTP 200 怎么看都是正常的、标准的,那 云 LB又有什么理由认为其无效呢?如果协议标准定义里面没有这个答案,那么只可能在 云 LB自己的定义 / 配置里面找寻答案了。
image.png
问题处理:
-
临时修改了云 LB(HAProxy)的配置,把它的限制从 8KB 提升到 16KB,这个问题立刻被解决了。
-
作为长期方案,我们建议客户合理使用 Set-Cookie 头部,确保整体的 HTTP Response size 在一定的合理区间之内(8KB),避免无谓的系统开销和难以预料的问题的发生。
image.png
HTTP header过大,造成前端无法请求的问题,后来分析是迭代一个新功能,在http heder中插入一个较大的token导致。
像一般的LB、waf,都有http header最大值限制,排错的时候都是一个点:
- 500 上游服务内部错误,如程序报错等;
- 503 上游服务资源不可用,有可能服务过载。
HTTP 502/503/504 状态码的本质
HTTP 5xx 系列状态码的语义的本质:跟 500 不同,502、503、504 都是 LB / 反向代理的后端的服务出了问题。基于这些理解,下一次你再遇到 5xx 的问题,相信就已经有比较充足的知识储备,能判断出是 Web 服务器本身有问题,还是反向代理 / LB 有问题了。
参考
为什么前端页面里多选一个城市就报错?
https://time.geekbang.org/column/article/490397
Hypertext Transfer Protocol -- HTTP/1.1
https://datatracker.ietf.org/doc/html/rfc2616
HTTP 教程
https://developer.mozilla.org/zh-CN/docs/Web/HTTP
HTTP 响应代码
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status