관련지식
nginx, querystring

URL을 호출하면서 QueryString으로 큰 사이즈의 파라미터를 넘길때 발생합니다. 파일 업로드와 같은 대용량 전송은 대부분 request body를 이용하기 때문에 이 에러가 발생하지 않겠지만, 텍스트를 get 방식으로 전달해야 하는 경우에 발생할 수 있습니다. 대량의 텍스트 전달 또한 post로 전송하는게 맞지만 어떤 경우엔 반드시 get 으로 보내야 할수도 있겠죠. 이때는 large_client_header_buffers 또는 client_header_buffer_size 설정을 변경하면 됩니다.

비슷해 보이는 속성이지만 두개의 설정은 의미가 좀 다릅니다. client_header_buffer_size 는 일반적으로 요청되는 request에 대한 버퍼크기를 지정하는 것이고 large_client_header_buffers는 보통의 header 사이즈를 넘는 요청에 대해 처리할 버퍼 크기를 지정하는 것입니다.

잠깐 예를 들어보겠습니다. 설정을 건드리지 않는다면 공식 가이드에 있는것처럼 아래와 같이 설정되어 있습니다.

  1. client_header_buffer_size 1k;
  2. large_client_header_buffers 4 8k;

이것은 일반적인 요청의 헤더는 1kb 버퍼로 처리하고 그것보다 큰 요청은 8k 버퍼로 처리한다는 의미 입니다. 8kb 앞에 적힌 숫자 4는 8kb 버퍼를 4개 만든다는 뜻입니다. 큰 요청은 동시에 최대 4개까지 처리할수 있다는 뜻이 되겠죠. 만약 QueryString에 2kb 텍스트를 파라미터로 전달한다면 large_client_header_buffers 버퍼를 사용하여 처리하게 될 것입니다. 요청 헤더가 8kb를 넘으면 414 오류가 발생하구요.

만약 아래와 같이 client_header_buffer_size 만 버퍼 크기를 늘려도 414 에러를 처리할수 있습니다. 하지만 대부분의 요청은 64k가 아닐텐데 과하게 버퍼를 늘린것이므로 서버 자원을 낭비하게 되겠죠.

  1. client_header_buffer_size 64k;

따라서 특수한 경우가 아니라면 아래처럼 large_client_header_buffers 설정만 수정하는게 맞습니다.

  1. large_client_header_buffers 4 64k;

http와 server 에 설정이 가능하므로 site-available 의 환경설정에 추가하시면 됩니다.