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
本指南解释了如何通过三种不同方式调整这些限制:
- 通过Kong部署或Kong配置JSON
- 通过NGINX Ingress Controller ConfigMap
- 通过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
这是最细粒度的控制级别,并且优先级高于全局设置。
应用优先级顺序
当多个设置共存时,系统按以下优先级顺序解析它们:
- Ingress资源注释(特定服务级别覆盖)
- NGINX Ingress ConfigMap(全局适用于所有Ingress资源)
- Kong Gateway部署/Kong配置(仅限Kong代理内部)
摘要表
Use Case | Relevant 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) |