【问题标题】:Nginx Ingress returns 413 Entity Too LargeNginx Ingress 返回 413 Entity Too Large
【发布时间】:2022-02-21 22:20:32
【问题描述】:

在我的集群上,我正在尝试上传一个大文件,但是当我尝试时,我得到了 413 Error

error parsing HTTP 413 response body: invalid character '<' looking for beginning of value: "<html>\r\n<head><title>413 Request Entity Too Large</title></head>\r\n<body>\r\n<center><h1>413 Request Entity Too Large</h1></center>\r\n<hr><center>nginx/1.19.3</center>\r\n</body>\r\n</html>\r\n"

我知道这是由 nginx 的默认参数引起的,我需要覆盖它。在文档中,我发现这可以通过两种方式完成:

  1. 在入口配置上使用注释
  2. 使用 configMap

两种方法我都试过了,都没有结果。

这是我的 yaml: ingress.yml

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/proxy-body-size: "700m"
  name: nginx-ingress
spec:
  rules:
    - host: example.com
      http:
        paths:
          - backend:
              serviceName: nginx-service
              servicePort: 80
            path: /              

和 configmap.yml:

apiVersion: v1
data:
  proxy-body-size: "800m"
kind: ConfigMap
metadata:
  name: ingress-nginx-controller
  labels:
    app.kubernetes.io/name: nginx-ingress
    app.kubernetes.io/part-of: nginx-ingress

【问题讨论】:

  • 您是否在应用这些更改后重新启动了 ingress pod?
  • 是的,我做了,但什么也没做

标签: kubernetes nginx-ingress


【解决方案1】:

对于以后的搜索,它对我有用:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: "0"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
  name: docker-registry
  namespace: docker-registry
spec:

【讨论】:

    【解决方案2】:

    这里已经有一些很好的答案可以避免413。

    例如使用以下注释编辑 Ingress(更好地重新部署):

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/proxy-body-size: "0"
        nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
        nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
    

    此外,对于 NGINX,当请求中的大小超过客户端请求正文的最大允许大小时,将向客户端返回 413 错误。这个大小可以通过参数client_max_body_sizereference来配置。

    【讨论】:

      【解决方案3】:

      我在 GKE 上使用 Nginx Ingress 时遇到了同样的问题。

      这些是对我有用的注释:

      apiVersion: extensions/v1beta1
      kind: Ingress
      metadata:
        annotations:
          kubernetes.io/ingress.class: nginx
          nginx.org/client-max-body-size: "0"
          nginx.org/proxy-connect-timeout: 600s
          nginx.org/proxy-read-timeout: 600s
      

      不要忘记为您输入正确的值。

      有关更多详细信息,您可以查看以下文档:

      1. Using Annotations
      2. Client Max Body Size

      PS我已经按照this tutorial 安装了我的“Nginx Ingress Controller”。

      【讨论】:

        【解决方案4】:

        对于 NGINX,当请求中的大小超过客户端请求正文的最大允许大小时,将向客户端返回 413 错误。这个大小可以通过参数来配置

        要为所有 Ingress 规则全局配置此设置,可以在 NGINX ConfigMap 中设置 proxy-body-size 值。要在 Ingress 规则中使用自定义值,请定义以下注释:

        nginx.ingress.kubernetes.io/proxy-body-size: 8m
        

        https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#custom-max-body-size

        对于 node.js 你可以设置

        app.use(express.json({ limit: '50mb' }));
        app.use(express.urlencoded({ limit: '50mb' }));
        

        【讨论】:

          【解决方案5】:

          在设置时需要注意以下几点:

          1. 最好重新创建 Ingress 对象而不是对其进行编辑以确保正确加载配置。删除 Ingress 并使用适当的注释重新创建它。

          2. 如果这仍然不起作用,您可以尝试使用ConfigMap 方法,例如:


          apiVersion: v1
          kind: ConfigMap
          metadata:
            name: nginx
            namespace: ingress-nginx
            labels:
              app: ingress-nginx
          data:
            proxy-body-size: "8m"
          
          1. 请注意,将大小设置为 0 会禁用对客户端请求正文大小的检查。

          2. 请记住将值设置为大于您尝试推送的数据大小。

          3. 根据您的 Kubernetes 版本使用正确的 apiVersion。 Notice that:

          extensions/v1beta1 和 networking.k8s.io/v1beta1 API 版本 在 v1.22 中将不再提供 Ingress。

          • 迁移清单和 API 客户端以使用 networking.k8s.io/v1 API 版本,自 v1.19 起可用。

          • 所有现有的持久化对象都可以通过新的 API 访问

          【讨论】:

            【解决方案6】:

            也许我的经验会对某人有所帮助。我在 nginx 中的所有设置都正常,但 nginx 在代理模式下站在 CloudFlare 后面。所以尝试将其设置为“仅 DNS”,以确保您和 nginx 之间没有任何内容。

            【讨论】:

              【解决方案7】:

              以下配置适合我:

              apiVersion: networking.k8s.io/v1beta1
              kind: Ingress
              metadata:
                name: cs-ingress
                annotations:
                  kubernetes.io/ingress.class: "nginx"
                  nginx.ingress.kubernetes.io/use-regex: "true"
                  nginx.ingress.kubernetes.io/proxy-body-size: 16m
              

              参考:https://github.com/kubernetes/ingress-nginx/issues/4825

              【讨论】:

                猜你喜欢
                • 2016-10-03
                • 1970-01-01
                • 1970-01-01
                • 2012-10-05
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多