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
- 変更するタイミング: request-transformer や rate-limiting などのボディ操作プラグインを使用する場合、ディスクへの書き込みを避けるため。
- 推奨: client_max_body_size に合わせること、例: 50m。
- 注意: 大きな値はメモリ消費を増加させるため、設定時にはリクエストの同時実行を考慮すること。
nginx_admin_client_body_buffer_size
- 説明: 上記と同様ですが、Admin API リクエストボディ用です。
- デフォルト: 10m
- 推奨: Admin API のワークロードに基づいて拡張する。
設定方法
方法 1: Kong デプロイメントまたは APIM コンソール設定
内部のKong Gatewayポッド内で実行されているNGINXにのみ適用されます。
オプションA – Kongデプロイメント環境変数の変更4
- 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 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: "50m" spec: ingressClassName: nginx rules:
- host: your.example.com
http:
paths:
- path: / pathType: Prefix backend: service: name: your-service port: number: 80
これは最も細かい制御レベルであり、グローバル設定よりも高い優先順位を持ちます。

### アプリケーションの優先順位 \{#priority-order-of-application}
複数の設定が共存する場合、システムは次の優先順位でそれらを解決します:
1. Ingressリソースのアノテーション(特定のサービスレベルのオーバーライド)
1. NGINX Ingress ConfigMap(すべてのIngressリソースにグローバルに適用)
1. Kong Gatewayデプロイメント / Kong設定(Kongプロキシ内部のみ)
## サマリーテーブル \{#summary-table}
| <b>Use Case</b> | <b>Relevant Parameters</b> |
| --- | --- |
| 大きなヘッダー | nginx_http_client_header_buffer_size, nginx_http_large_client_header_buffers |
| 大きなボディ(クライアント) | nginx_http_client_max_body_size, nginx_http_client_body_buffer_size |
| 大きなボディ(管理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) |