ios http2客户端访问nginx失败bug

Posted tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ios http2客户端访问nginx失败bug相关的知识,希望对你有一定的参考价值。

我们将项目迁入腾讯云后,外网访问流量转发如下
外网---》大禹BGP(BGPAntiDDoS)高防----》lbc(LoadBalance cluster)----》lb-----》project

ios开发同事在用ios客户端访问项目发现请求失败,但是偶尔会成功。ios客户端访问默认http2,并且请求接口为post请求.根据如下定位了nginx版本对ios客户端的bug。

原因:(

为了减少网络时延,不少 HTTP/2 客户端会在建立 HTTP/2 连接时同时发送其它帧,包括用来 POST 数据的 DATA 帧。
而 Nginx 在客户端接受到 SETTINGS 帧之前,一直将初始窗口大小(initial window size)设置为 0。
也就是说,客户端收到 SETTINGS 帧之前发送的 DATA 帧,会被 Nginx 以 REFUSED_STREAM 帧拒绝。而部分客户端在收到 REFUSED_STREAM 帧之后,
会提示连接失败,而不是发起重试,这就是产生 Bug 的原因。

https://imququ.com/post/nginx-http2-post-bug.html

https://stackoverflow.com/questions/36907767/nsurlerrordomain-code-1004-for-few-seconds-after-app-start-up

我检查了lb nginx的版本1.11。断定是腾讯云负载层lbc的问题。跟腾讯云交流后,发现他们也有在灰度测试升级版本(ios请求偶尔会成功的原因),经沟通,全面升级lbc版本至1.11

最终问题解决。

 

 

以上是关于ios http2客户端访问nginx失败bug的主要内容,如果未能解决你的问题,请参考以下文章

nginx Http2 Push 在 Vary 时失败:接受标头集

Nginx 1.10 上的 SPDY 代替 HTTP2

如何为无 ALPN 客户端配置 Nginx 仅支持 HTTP2

nginx 配置模板

http2 似乎不适用于 OkHttp3 和 retrofit2

nginx 启用http2 https 无法访问的问题