實際上造成此問題的核心還是請求並發太大(實際的場景也是這樣的,有一個大量的圖片請求服務)
環境說明
一般大家部署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
