[구성]
EKS 사용중이며, 여러개의 Application Pod를 하나의 Cluster에서 실행 중.
Nginx Ingress Controller 사용하여 서비스로 트래픽 라우팅
[현상]
특정 Application 호출 요청 시, 아래와 같은 에러 발생
<head><title>400 Request Header Or Cookie Too Large</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<center>Request Header Or Cookie Too Large</center>
[원인]
요청 시, Header의 사이즈가 너무 커서 생기는 문제. 웹 애플리케이션에서 해당 API 호출 시, 너무 많은 양의 쿠키를 요청에 담아서 보내는 것으로 확인되었음.
쿠키를 줄이는 방안도 있겠지만, 빠른 문제 해결을 위해서 Nginx Ingress 설정을 변경함
[해결]
해결을 위해서, 'large_client_header_buffers'의 설정값을 변경.
기존 Default값으로 4 8k 설정되어있었음(버퍼 4개, 버퍼당 사이즈 8kb)
변경 값 -> large_client_header_buffers 4 16k;
large_client_header_buffers 설정은 클라이언트 요청 헤더가 client_header_buffer_size(default 1kb)로 지정된 크기를 초과할 때 사용되는 옵션이다.
옵션값을 수정하는 방법은 여러가지가 있는데, 직접 configmap 수정 후, ingress controller를 재시작하는 방법과 Ingress에 annotation을 이용하는 방법이다.
다만, Snippets을 이용해야 하는 단점이 있다.
snippets 사용은 최대한 지양하려 하고 있으나, 해당 설정 snippet 사용하지 않으면 전체 ingress controller config 수정 후 재시작이 필요하여 부득이 하게 snippets 사용을 했다.
1. 아래와 같이 configmap 수정 후, apply를 한다. 그 후, 재시작 하는 방법이 있다
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-ingress-controller
namespace: <your-namespace>
data:
large-client-header-buffers: "4 16k"
### apply
kubectl apply -f <your-configmap-file>.yaml
### restart
kubectl rollout restart deployment <nginx-ingress-controller-deployment> -n <your-namespace>
2. 아래와 같이 ingress 설정에 annotation 추가 후, 적용해주는 방법이 있다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/server-snippet: |
# 클라이언트 헤더 버퍼 크기 설정
large_client_header_buffers 4 16k;