【问题标题】:Ingress/Nginx NodeJS Express Multiple GET are failing when I try to retrieve the images当我尝试检索图像时,Ingress/Nginx NodeJS Express Multiple GET 失败
【发布时间】:2021-12-12 18:28:26
【问题描述】:

堆栈

  • Kubernetes(数字海洋)
  • 入口 Nginx 控制器
  • React 前端(静态文件)
  • NodeJS/Express 后端

在某些时候我需要加载多张图片,超过一百张,一些被检索但很多没有加载。在 chrome 控制台中,我收到以下错误:

GET https://api.mydomain.com/images/products/F10014-soporte-caja-2.501.jpg net::ERR_HTTP2_SERVER_REFUSED_STREAM

这些图片位于公共快递文件夹中:

let publicPath = path.join(__dirname, '/public')
console.log(`publicPath ${publicPath}`)

我查看了 NodeJS,但没有发现任何错误。我还尝试在ingress-nginx 服务中添加注释:

apiVersion: v1
kind: Service
metadata:
  annotations:
    kubernetes.digitalocean.com/load-balancer-id: "e7f5dc8e-3723-11ec-8d3d-0242ac130003"
    service.beta.kubernetes.io/do-loadbalancer-enable-proxy-protocol: "true"
    service.beta.kubernetes.io/do-loadbalancer-hostname: "mydomain.com"
  labels:
    helm.sh/chart: ingress-nginx-4.1.0
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/version: 1.0.0
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/component: controller
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  type: LoadBalancer
  externalTrafficPolicy: Local
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: http
    - name: https
      port: 443
      protocol: TCP
      targetPort: https
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/component: controller

我的问题是:

  1. 问题出在ingress-nginx 控制器上吗?
  2. 可以解决吗?
  3. 我应该更改我的解决方案并将文件放在另一个地方吗?

如果您需要信息,请告诉我。

【问题讨论】:

  • 您是否注意到失败的图像尺寸更大? LB 可能对您可以下载或上传的文件大小有默认大小限制。
  • 您使用的是哪个版本的 HTTP 协议?您是否尝试从您的网站(由您管理)或这是某个公共网站下载图片?
  • @Bala 感谢您的评论,我检查了文件大小,似乎不是问题所在,因为它们中的大多数大小几乎相同。但是,文件大小和请求数量的组合可能是问题所在。

标签: node.js express kubernetes nginx-ingress


【解决方案1】:

简而言之:

我的问题是

  • 问题出在 ingress-nginx 控制器上吗?

基本没有

  • 可以解决吗?

是的

  • 我应该更改我的解决方案并将文件放在另一个地方吗?

这取决于:)

解释:

首先,您需要确定错误的来源。您已收到来自此请求的ERR_HTTP2_SERVER_REFUSED_STREAMhttps://api.mydomain.com/images/products/F10014-soporte-caja-2.501.jpg。您似乎试图一次下载太多数据并收到此错误。你怎么能解决这个错误?首先,您可以尝试批量下载数据,而不是一次全部下载。另一种解决方案是配置您从中下载图片的 nginx 服务器。见documentation

设置连接中并发 HTTP/2 流的最大数量。

语法:http2_max_field_size 大小; 默认值:http2_max_field_size 4k; 上下文:http、服务器

你可以在这里设置更大的值。

你也可以在文件/etc/nginx/conf.d/custom_proxy_settings.conf中设置更大的值

http2_max_concurrent_streams 256;

文件的确切名称并不重要,它只需要以 .conf 结尾并挂载在 /etc/nginx/conf.d 中即可。

另一种解决方案可能是禁用 HTTP/2 并使用 HTTP/1.1 协议,但这可能存在安全风险。

你也问过:

我应该更改我的解决方案并将文件放在另一个地方吗?

可以,但没必要。

【讨论】:

  • 感谢您的回答,我还没有编码,但从您的回答中,我假设我会在对结果进行分页时解决问题(如 20 或 50,但不是 1000)
猜你喜欢
  • 2012-07-17
  • 1970-01-01
  • 2019-11-10
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
相关资源
最近更新 更多