跳到主要内容

HTTP Header Max Size Adjustment

本指南提供了有关如何修改与Kong Gateway和Kubernetes上的NGINX Ingress环境中的HTTP请求相关的缓冲区和主体大小限制的详细说明。这些配置有助于防止由于大头部或有效负载导致的请求失败。

概述

Kong使用嵌入式NGINX引擎来处理HTTP流量。默认情况下,NGINX对请求头和主体应用保守的大小限制。在生产环境中,尤其是在处理:大请求头(例如,JWT令牌、Cookie、用户代理)、大请求主体(例如,文件上传)或高并发请求转换时,…

这些限制必须增加,以避免出现以下错误:

  • 400 Bad Request – 请求头或Cookie过大
  • 413 Request Entity Too Large

本指南解释了如何通过三种不同方式调整这些限制:

  1. 通过Kong部署或Kong配置JSON
  2. 通过NGINX Ingress Controller ConfigMap
  3. 通过Ingress资源注释(每个服务)

关键配置参数(详细分解)

nginx_http_client_header_buffer_size

  • 描述:设置读取客户端请求头时使用的单个缓冲区的大小。
  • 默认值:1k
  • 何时修改:如果请求头如Authorization、Cookie、User-Agent变得过长(例如,SSO令牌或多Cookie头)。
  • 推荐:增加到4k或8k以确保稳定性。
  • 注意:设置过大可能会在高并发下增加内存使用。

nginx_http_large_client_header_buffers

  • 描述:配置用于大请求头的缓冲区的数量和大小(例如,多接收者Cookie)。
  • 默认值:4 8k(4个8k的缓冲区)
  • 何时修改:如果遇到400 Bad Request – 请求头或Cookie过大。
  • 推荐:增加到4 16k或8 16k。
  • 注意:仅在需要时扩展,以避免不必要的内存开销。

nginx_http_client_max_body_size

  • 描述:定义Kong根据Content-Length接受的请求主体的最大大小。
  • 默认值:0(无限制)
  • 何时修改:为了防止超大主体有效负载(例如,大文件上传)导致413错误。
  • 推荐:根据预期使用设置,例如,10m、50m。
  • 注意:超过此大小的请求将触发Kong的413响应。

nginx_admin_client_max_body_size

  • 描述:设置Admin API接受的最大主体大小。
  • 默认值:10m
  • 何时修改:在向Admin API发送大配置有效负载时(例如,批量路由注册)。
  • 推荐:如有需要,设置为20m到50m。
  • 注意:由于Admin API敏感,过多增加可能会引入安全风险。

nginx_http_client_body_buffer_size

  • 描述:读取请求主体到内存的缓冲区大小。如果主体超过此大小,则写入磁盘。
  • 默认值:8k
  • 何时修改:在使用请求转换、速率限制等主体操作插件时,以避免写入磁盘。
  • 推荐:与client_max_body_size匹配,例如,50m。
  • 注意:大值会增加内存消耗(设置时考虑请求并发)。

nginx_admin_client_body_buffer_size

  • 描述:与上述相同,但用于Admin API请求主体。
  • 默认值:10m
  • 推荐:根据Admin API工作负载扩展。

配置方法

方法1:Kong部署或APIM控制台配置

仅适用于运行在Kong Gateway Pod内部的内部NGINX。

选项A – 修改Kong部署环境变量

- name: KONG_NGINX_HTTP_CLIENT_HEADER_BUFFER_SIZE
value: "4k"
- name: KONG_NGINX_HTTP_LARGE_CLIENT_HEADER_BUFFERS
value: "4 16k"
- name: KONG_NGINX_HTTP_CLIENT_MAX_BODY_SIZE
value: "50m"
- name: KONG_NGINX_ADMIN_CLIENT_MAX_BODY_SIZE
value: "20m"
- name: KONG_NGINX_HTTP_CLIENT_BODY_BUFFER_SIZE
value: "50m"

选项B – 通过APIM控制台中的Kong配置JSON进行修改

{
"nginx_http_client_body_buffer_size": "8k",
"nginx_proxy_buffer_size": "16k",
"nginx_proxy_buffers": "10 16k",
"nginx_proxy_busy_buffers_size": "64k"
}

更改后,重启Kong Pods:

kubectl rollout restart deployment kong -n <namespace>

方法2:NGINX Ingress Controller ConfigMap

适用于所有通过NGINX Ingress Controller路由的流量。

示例:

apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-configuration
namespace: ingress-nginx
data:
proxy-body-size: "50m"
client-header-buffer-size: "4k"
large-client-header-buffers: "4 16k"
client-body-buffer-size: "50m"

应用更改后重启Ingress Controller:

kubectl rollout restart deployment ingress-nginx-controller -n ingress-nginx

方法3:Ingress资源注释

仅适用于通过Ingress清单中的注释针对特定服务。

示例:

apiVersion: [networking.k8s.io/v1](http://networking.k8s.io/v1)
kind: Ingress
metadata:
name: my-ingress
namespace: your-namespace
annotations:
[nginx.ingress.kubernetes.io/proxy-body-size:](http://nginx.ingress.kubernetes.io/proxy-body-size:) "50m"
[nginx.ingress.kubernetes.io/client-body-buffer-size:](http://nginx.ingress.kubernetes.io/client-body-buffer-size:) "50m"
spec:
ingressClassName: nginx
rules:
- host: your.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: your-service
port:
number: 80

这是最细粒度的控制级别,并且优先级高于全局设置。

应用优先级顺序

当多个设置共存时,系统按以下优先级顺序解析它们:

  1. Ingress资源注释(特定服务级别覆盖)
  2. NGINX Ingress ConfigMap(全局适用于所有Ingress资源)
  3. Kong Gateway部署/Kong配置(仅限Kong代理内部)

摘要表

Use CaseRelevant Parameters
大头部nginx_http_client_header_buffer_size, nginx_http_large_client_header_buffers
大主体(客户端)nginx_http_client_max_body_size, nginx_http_client_body_buffer_size
大主体(Admin API)nginx_admin_client_max_body_size, nginx_admin_client_body_buffer_size
Ingress范围限制使用ConfigMap设置proxy-body-size、client-body-buffer-size等。
每服务覆盖使用Ingress注释(例如,proxy-body-size、client-body-buffer-size)