1. 程式人生 > 其它 >nginx net::ERR_HTTP2_SERVER_REFUSED_STREAM 問題參考解決方法

nginx net::ERR_HTTP2_SERVER_REFUSED_STREAM 問題參考解決方法

實際上造成此問題的核心還是請求併發太大(實際的場景也是這樣的,有一個大量的圖片現實服務)

環境說明

一般大家部署nginx (openresty)的時候都會開啟keepalive_timeout的,當前版本預設是75s,我們使用了65s

可選的優化方法

  • 禁用http2
    如果搜尋相關問題,會看到禁用http2之後錯誤消失了,此問題就是http2的,禁用應該就沒有了,因為是圖片服務,我們是希望使用http2
    的多路複用,提高圖片現實的速度,所以此方法先放棄了
  • 加大http2_max_concurrent_streams
    預設為128 但是經過測試之後還是沒有解決,此問題依然很明顯 (嘗試過調整不同的引數,500,1000)
  • 調整http2_max_requests (1.19.7 之後修改為了keepalive_requests) 1.19.10 之前的版本預設引數為100
    因為我們使用的openresty 1.19.9.1 (nginx 版本1.19.9)所以直接修改keepalive_requests 為1000
    經過測試問題緩解,基本可以算是100%解決,服務比較穩定,此引數應該結合實際進行調整修改

說明

以上只是在解決碰到問題的一些方法嘗試,理論上對於大併發場景,大家基於nginx http2 都會存在類似的問題,可以參考
多看看nignx 的changes還是很有用的(出現問題官方文件應該經常翻),openresty 也是一樣的,目前openresty1.21.4 rc1 已經發布了,期待ga,對於nginx
的配置還是應該結合實際業務場景進行調整優化,沒有通用的配置,只有不斷優化的引數,http2 協議是複雜的,http3 更加
複雜,瞭解下相關的協議還是很有用的,至少我們排錯解決問題會快很多

參考資料

http://nginx.org/en/docs/http/ngx_http_v2_module.html#http2_max_concurrent_streams
https://stackoverflow.com/questions/66572034/inconsistent-err-http2-server-refused-stream-error-on-page-load
https://confluence.atlassian.com/jirakb/some-jira-pages-fail-to-render-or-some-actions-fail-to-complete-with-the-error-err_http2_server_refused_stream-1085441145.html


https://nginx.org/en/CHANGES
https://stackoverflow.com/questions/24122506/neterr-insufficient-resources-error-when-adding-numerous-img-elements-to-dom
https://openresty.org/en/ann-1019009001.html