1. 程式人生 > >ios http2客戶端訪問nginx失敗bug

ios http2客戶端訪問nginx失敗bug

tps bsp bgp -h refused htm 騰訊雲 連接 b-

我們將項目遷入騰訊雲後,外網訪問流量轉發如下
外網---》大禹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