K8s中Ingress Nginx下Express批量拉取图片报ERR_HTTP2_SERVER_REFUSED_STREAM
问题1:该问题是否是ingress-nginx控制器导致的?
是,你遇到的net::ERR_HTTP2_SERVER_REFUSED_STREAM报错,本质是HTTP/2协议下服务端主动拒绝了超出并发限制的请求流。由于你排查NodeJS侧无任何报错,说明请求在到达Express服务前就被ingress-nginx拦截拒绝,根因是ingress-nginx的默认HTTP/2并发配置无法支撑你同时加载上百张图片的请求量。
问题2:这个问题能否被解决?
完全可以,通过调整ingress-nginx的相关配置即可解决:
- 调整HTTP/2并发流限制:ingress-nginx默认的
http2_max_concurrent_streams参数值为128,你可以在对应Ingress资源上添加注解调高该值:
nginx.ingress.kubernetes.io/http2-max-concurrent-streams: "1024"
- 调整长连接请求数限制:默认
keepalive_requests参数值为100,单长连接内超过该数值的请求会被强制断开,同步调高该参数:
nginx.ingress.kubernetes.io/keepalive-requests: "1000"
- (可选优化)添加静态资源缓存规则,让ingress-nginx直接缓存public目录下的图片资源,无需每次透传到Express服务,进一步降低请求开销:
nginx.ingress.kubernetes.io/configuration-snippet: | location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; add_header Cache-Control "public, no-transform"; }
问题3:我是否需要调整现有方案,将文件存放到其他位置?
短期内不需要,完成上述配置调整后即可满足当前场景需求。如果后续静态资源访问量持续增长,可以考虑将静态资源迁移到对象存储服务,进一步降低后端服务压力、提升访问加载速度。
内容的提问来源于stack exchange,提问作者agusgambina
相关产品推荐
相关产品推荐

