1. 出现net::ERR_HTTP2_SERVER_REFUSED_STREAM错误

问题现象

访问网页时,部分资源无法正确加载,控制台中有 net::ERR_HTTP2_SERVER_REFUSED_STREAMnet::ERR_FAILED报错。

问题原因

以开始前端项目打包出来是放到裸机上以nginx运行的没有出现这种问题,但是部署到k8s由ingress作为入口就出现了这个现象,排查发现是前端开发人员打包前端代码错误,产生了几百上千个js文件,只要一加载单个页面就是接近上千个请求,本质就是资源并行请求数较多,达到HTTP2最大流数限制了。

解决方案

  1. 在ConfigMap中根据实际需要,调整http2-max-concurrent-streams至更大值(默认128),可以参考 http2-max-concurrent-streams

  2. 在ConfigMap中直接关闭HTTP2支持,设置use-http2为false。具体操作,可以参考 use-http2

优化配置

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-ingress-controller
# nginx ingress 性能优化: https://www.nginx.com/blog/tuning-nginx/
data:
  # nginx 与 client 保持的一个长连接能处理的请求数量,默认100,高并发场景建议调高。  
  # 参考: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#keep-alive-requests
  keep-alive-requests: "10000"
  # nginx 与 upstream 保持长连接的最大空闲连接数 (不是最大连接数),默认 320,在高并发下场景下调大,避免频繁建联导致 TIME_WAIT 飙升。  
  # 参考: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#upstream-keepalive-connections
  upstream-keepalive-connections: "2000"
  # 每个 worker 进程可以打开的最大连接数,默认 16384。  
  # 参考: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#max-worker-connections
  max-worker-connections: "65536"