Nginx 장애대응

Published: by Creative Commons Licence

장애내용 및 확인

현재 운영중인 플랫폼에 일정량 이상의 쿠키가 적재되면 Nginx로 요청이 들어오지 않는 현상이 발견됐다. 브라우저 스크립트 콘솔에서는 ERR_CONNECTION_CLOSED 에러가 나고 Nginx로 요청이 들어오지 않는다. 쿠키의 일부를 삭제하고 요청을 하면 Nginx로 요청이 들어오고 쿠키가 다시 쌓여 16K이상의 쿠키가 적재되면 Nginx로 요청이 안들어오게 된다.Nginx 설정에 문제가 있음을 감지하고 기본설정으로 되어있는 Nginx설정을 변경해 보았다.

Nginx 설정

  • client_body_buffer_size : 클라이언트 버퍼사이즈로 주로 FORM에서 POST액션으로 NGINX에 보내는 크기
  • client_header_buffer_size : 클라이언트 헤더 버퍼사이즈 (보통 1K로 설정)
  • client_max_body_size : 클라이언트 요청(request)에 허용된 최대 크기. 만약 최대크기를 초과하면 nginx는 413 에러를 만듬
  • large_client_header_buffers: 클라이언트 헤더 최대 개수 및 크기
  • http2_max_field_size: 압축된 요청 헤더 필드의 최대 크기 제한
  • http2_max_field_size: 압축 해제 후 전체 요청 헤더 목록의 최대 크기 제한

장애대응 내용

large_client_header_buffers의 값을 32k -> 64k -> 128k 로 변경하면서 테스트를 진행했지만 동일한 오류발생.
client_body_buffer_size 32k 추가했지만 동일한 오류발생.
http2_max_field_size, http2_max_header_size를 각각 128k 설정하고 났더니 더이상 오류가 발생하지 않고 그동안 쿠키정보가 많아서 들어오지 못하던 요청이 Nginx까지 정상적으로 들어오게 되었다.
최종적으로 수정 또는 추가된 설정은 아래와 같다.

client_body_buffer_size 32k;
large_client_header_buffers 4 128k;

http2_max_field_size   128k;
http2_max_header_size  128k;  

지금은 위의 설정대로 적용이 되어 있는 상태이고 수치의 최적화는 운영을 해가면서 찾아가야 할 것 같다.

참고

sonarsource Community
stack overflow