HTTP Header Max Size Adjustment
Hướng dẫn này cung cấp hướng dẫn chi tiết về cách điều chỉnh giới hạn kích thước bộ đệm và thân liên quan đến các yêu cầu HTTP trong môi trường Kong Gateway và NGINX Ingress trên Kubernetes. Những cấu hình này giúp ngăn chặn các lỗi yêu cầu do tiêu đề hoặc tải trọng lớn.
Tổng quan
Kong sử dụng một động cơ NGINX nhúng để xử lý lưu lượng HTTP. Theo mặc định, NGINX áp dụng các giới hạn kích thước bảo thủ cho các tiêu đề và thân yêu cầu. Trong các môi trường sản xuất, đặc biệt khi xử lý: Các tiêu đề yêu cầu lớn (ví dụ: mã thông báo JWT, cookie, user-agent), các thân yêu cầu lớn (ví dụ: tải lên tệp), hoặc độ đồng thời cao với các biến đổi yêu cầu,…
Các giới hạn này phải được tăng lên để tránh các lỗi như:
- 400 Bad Request – Tiêu đề yêu cầu hoặc cookie quá lớn
- 413 Request Entity Too Large
Hướng dẫn này giải thích cách điều chỉnh các giới hạn này theo ba cách khác nhau:
- Thông qua Triển khai Kong hoặc JSON Cấu hình Kong
- Thông qua ConfigMap của Bộ điều khiển NGINX Ingress
- Thông qua Chú thích Tài nguyên Ingress (theo dịch vụ)
Các tham số cấu hình chính (Phân tích chi tiết)
nginx_http_client_header_buffer_size
- Mô tả: Đặt kích thước của một bộ đệm đơn được sử dụng khi đọc các tiêu đề yêu cầu của khách hàng.
- Mặc định: 1k
- Khi nào cần điều chỉnh: Nếu các tiêu đề yêu cầu như Authorization, Cookie, User-Agent trở nên quá dài (ví dụ: mã thông báo SSO hoặc tiêu đề nhiều cookie).
- Đề xuất: Tăng lên 4k hoặc 8k để đảm bảo tính ổn định.
- Cảnh báo: Đặt quá lớn có thể làm tăng mức sử dụng bộ nhớ dưới độ đồng thời cao.
nginx_http_large_client_header_buffers
- Mô tả: Cấu hình số lượng và kích thước của các bộ đệm cho các tiêu đề yêu cầu lớn (ví dụ: cookie nhiều người nhận).
- Mặc định: 4 8k (4 bộ đệm 8k mỗi cái)
- Khi nào cần điều chỉnh: Nếu gặp phải 400 Bad Request – Tiêu đề yêu cầu hoặc cookie quá lớn.
- Đề xuất: Tăng lên 4 16k hoặc 8 16k.
- Cảnh báo: Chỉ mở rộng khi cần thiết để tránh quá tải bộ nhớ không cần thiết.
nginx_http_client_max_body_size
- Mô tả: Định nghĩa kích thước tối đa của thân yêu cầu mà Kong chấp nhận dựa trên Content-Length.
- Mặc định: 0 (không giới hạn)
- Khi nào cần điều chỉnh: Để ngăn chặn các tải trọng thân quá lớn (ví dụ: tải lên tệp lớn) gây ra lỗi 413.
- Đề xuất: Đặt theo mức sử dụng dự kiến, ví dụ: 10m, 50m.
- Cảnh báo: Các yêu cầu vượt quá kích thước này sẽ kích hoạt phản hồi 413 từ Kong.
nginx_admin_client_max_body_size
- Mô tả: Đặt kích thước thân tối đa được chấp nhận bởi API Quản trị.
- Mặc định: 10m
- Khi nào cần điều chỉnh: Khi gửi các tải trọng cấu hình lớn đến API Quản trị (ví dụ: đăng ký tuyến hàng loạt).
- Đề xuất: 20m đến 50m nếu cần.
- Cảnh báo: Vì API Quản trị rất nhạy cảm, việc tăng quá nhiều có thể gây ra rủi ro bảo mật.
nginx_http_client_body_buffer_size
- Mô tả: Kích thước bộ đệm để đọc thân yêu cầu vào bộ nhớ. Nếu thân vượt quá kích thước này, nó sẽ được ghi vào đĩa.
- Mặc định: 8k
- Khi nào cần điều chỉnh: Khi sử dụng các plugin thao tác thân như request-transformer, giới hạn tỷ lệ, v.v., để tránh ghi vào đĩa.
- Đề xuất: Khớp với client_max_body_size, ví dụ: 50m.
- Cảnh báo: Các giá trị lớn làm tăng mức tiêu thụ bộ nhớ (cân nhắc độ đồng thời yêu cầu khi thiết lập).
nginx_admin_client_body_buffer_size
- Mô tả: Tương tự như trên, nhưng cho các thân yêu cầu API Quản trị.
- Mặc định: 10m
- Đề xuất: Mở rộng dựa trên khối lượng công việc của API Quản trị.
Phương pháp cấu hình
Phương pháp 1: Triển khai Kong hoặc Cấu hình APIM Console
Chỉ áp dụng cho NGINX nội bộ chạy bên trong các pod Kong Gateway.
Tùy chọn A – Điều chỉnh Biến Môi Trường Triển Khai 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"
Tùy chọn B – Điều chỉnh thông qua JSON Cấu hình Kong trong APIM Console
{
"nginx_http_client_body_buffer_size": "8k",
"nginx_proxy_buffer_size": "16k",
"nginx_proxy_buffers": "10 16k",
"nginx_proxy_busy_buffers_size": "64k"
}
Sau khi thay đổi, khởi động lại các pod Kong:
kubectl rollout restart deployment kong -n <namespace>
Phương pháp 2: ConfigMap của Bộ điều khiển NGINX Ingress
Áp dụng cho tất cả lưu lượng được định tuyến qua Bộ điều khiển NGINX Ingress.
Ví dụ:
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"
Khởi động lại Bộ điều khiển Ingress sau khi áp dụng các thay đổi:
kubectl rollout restart deployment ingress-nginx-controller -n ingress-nginx
Phương pháp 3: Chú thích Tài nguyên Ingress
Chỉ áp dụng cho một dịch vụ cụ thể thông qua các chú thích trong bản khai Ingress.
Ví dụ:
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
Đây là cấp độ kiểm soát chi tiết nhất và có ưu tiên cao nhất so với các cài đặt toàn cầu.
Thứ tự ưu tiên của ứng dụng
Khi nhiều cài đặt đồng tồn tại, hệ thống sẽ giải quyết chúng theo thứ tự ưu tiên sau:
- Chú thích Tài nguyên Ingress (ghi đè cấp dịch vụ cụ thể)
- ConfigMap của NGINX Ingress (áp dụng toàn cầu cho tất cả các tài nguyên Ingress)
- Triển khai Kong Gateway / Cấu hình Kong (nội bộ chỉ cho proxy Kong)
Bảng tóm tắt
Use Case | Relevant Parameters |
---|---|
Tiêu đề lớn | nginx_http_client_header_buffer_size, nginx_http_large_client_header_buffers |
Thân lớn (khách hàng) | nginx_http_client_max_body_size, nginx_http_client_body_buffer_size |
Thân lớn (API Quản trị) | nginx_admin_client_max_body_size, nginx_admin_client_body_buffer_size |
Giới hạn toàn cầu Ingress | Sử dụng ConfigMap với proxy-body-size, client-body-buffer-size, v.v. |
Ghi đè theo dịch vụ | Sử dụng chú thích Ingress (ví dụ: proxy-body-size, client-body-buffer-size) |