HTTP Header Max Size Adjustment
このガイドでは、Kong GatewayおよびKubernetes上のNGINX Ingress環境におけるHTTPリクエストに関連するバッファおよびボディサイズ制限を変更する方法についての詳細な手順を提供します。これらの設定は、大きなヘッダーやペイロードによるリクエストの失敗を防ぐのに役立ちます。
概要
Kongは、HTTPトラフィックを処理するために埋め込まれたNGINXエンジンを使用しています。デフォルトでは、NGINXはリクエストヘッダーとボディに対して保守的なサイズ制限を適用します。特に、次のような状況での本番環境では:大きなリクエストヘッダー(例:JWTトークン、クッキー、ユーザーエージェント)、大きなリクエストボディ(例:ファイルアップロード)、またはリクエスト変換を伴う高い同時実行性…
これらの制限は、次のようなエラーを回避するために増加させる必要があります:
- 400 Bad Request – リクエストヘッダーまたはクッキーが大きすぎます
- 413 Request Entity Too Large
このガイドでは、これらの制限を3つの異なる方法で調整する方法を説明します:
- KongデプロイメントまたはKong設定JSONを介して
- NGINX IngressコントローラーConfigMapを介して
- Ingressリソースアノテーション(サービスごとに)
主要設定パラメータ(詳細な内訳)
nginx_http_client_header_buffer_size
- 説明:クライアントリクエストヘッダーを読み取る際に使用される単一バッファのサイズを設定します。
- デフォルト:1k
- 変更するタイミング:Authorization、Cookie、User-Agentなどのリクエストヘッダーが長すぎる場合(例:SSOトークンやマルチクッキーヘッダー)。
- 推奨:安定性を確保するために4kまたは8kに増加させる。
- 注意:あまりにも大きく設定すると、高い同時実行性の下でメモリ使用量が増加する可能性があります。
nginx_http_large_client_header_buffers
- 説明:大きなリクエストヘッダー(例:マルチレシピエントクッキー)のためのバッファの数とサイズを設定します。
- デフォルト:4 8k(8kのバッファが4つ)
- 変更するタイミング:400 Bad Request – リクエストヘッダーまたはクッキーが大きすぎる場合。
- 推奨: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ポッド内で実行される内部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ポッドを再起動します:
kubectl rollout restart deployment kong -n <namespace>
方法2:NGINX IngressコントローラーConfigMap
NGINX Ingressコントローラーを介してルーティングされるすべてのトラフィックに適用されます。
例:
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コントローラーを再起動します:
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全体の制限 | proxy-body-size、client-body-buffer-sizeなどを使用したConfigMap |
サービスごとのオーバーライド | Ingressアノテーション(例:proxy-body-size、client-body-buffer-size)を使用 |