AWS Elastic Beanstalk 413 Request Entity Too Large 오류 해결

문제의 원인

Elastic Beanstalk 를 이용해서 웹 서비스를 Deploy 할 경우 어플리케이션의 Reverse Proxy로 사용되는 Nginx의 설정 때문이다. Nginx의 설정 값 중 client_max_body_size를 이용하면 client가 너무 큰 사이즈의 request를 보내지 못 하도록 제한을 걸 수 있다. 이 설정은 request의 Content-Length 헤더값이 client_max_body_size에 설정된 값을 넘을 수 없도록 제한한다.(악의적인 대용량 파일 업로드 등을 방지하는데 사용)

다만 이 client_max_body_size 의 기본 값이 1MB 정도로 너무 낮게 설정되어 있기 때문에, 1MB를 초과하는 파일을 POST로 업로드 하는 일반적인 상황에서도 에러메세지가 표시되며 요청이 실패하는 경우가 발생 한다.

해결 방법

Elastic Beanstalk 환경이 아니라면, Nginx 설정(nginx.conf)파일을 직접 수정하는게 가장 빠른 해결책 이겠지만, Elastic Beanstalk 을 사용하여 배포된 환경에서 해당 인스턴스에 직접 접속하여 Nginx 설정 파일을 직접 수정하는 것은 좋은 생각이 아니다. 직접 Nginx파일을 수정하면 오토스케일링 상황에서 새로 생성된 인스턴스에서는 여전히 동일한 이슈가 발생하거나 해당 어플리케이션을 새로운 환경에 배포 했을 때에도 동일한 문제가 재발 하여 환경의 강건성(Robustness)을 떨어뜨리는 요인이 되기 때문이다. 어플리케이션 코드 이외의 인프라에 신경을 쓰지 않아도 되도록 만들어주는 Elastic Beanstalk의 장점을 십분 살리기 위해서는 Elastic Beanstalk 에 업로드 되는 어플리케이션 패키지 내에서 해당 이슈를 해결 할 수 있도록 구성하여야 한다.

AWS Elastic Beanstalk 공식 문서 중 Extending Elastic Beanstalk Linux platforms 를 참고 하면 배포되는 환경의 Nginx 설정을 수정하는 방법에 대해 정확히 서술되어 있는데 어플리케이션 루트(아래 구조 예시에선 ~/workspace/my-app/)에서 아래와 같은 경로에 Nginx 설정 파일을 추가하면 해당 설정을 배포 환경의 Nginx가 포함하게 된다.

~/workspace/my-app/
|-- .platform
|   `-- nginx
|       `-- conf.d
|           `-- myconf.conf
`-- other source files

즉 위 구조에서는 myconf.conf의 내용으로(파일명은 상관 없음, 확장자는 .conf 이어야 함) 원하는 최대 용량을 아래와 같이 지정하고 어플리케이션을 다시 배포하면 해당 문제를 해결 할 수 있다.(0으로 값을 지정하면 무제한으로 설정됨)

client_max_body_size 50M;

SEO의 기본-검색엔진에 Sitemap.xml 제출하기

SEO, 검색엔진최적화

블로그 뿐만이 아니라, 내가 개발한 대부분의 웹사이트에서 중요시 여기는 것은 SEO(Search Engine Optimization, 검색엔진최적화)이다.

물론 네이버의 검색 점유율이 압도적인 한국에서는 (SEO=네이버 서비스에 컨텐츠 올리기)로 다소 변질 되었지만, 그렇다고 SEO를 할 필요가 없는 것은 아니다. 아무리 검색 결과 순위를 맘대로 매기는 네이버라고해도 SEO가 잘된 사이트와 그렇지 않은 사이트는 구분할 것이며, 사이트 규모가 커질 수록 네이버 뿐만 아니라 구글 등 다른 검색엔진을 통해 유입되는 트래픽이 늘어나기 때문에 SEO를 미리미리 잘해 두는 것이 좋다.

Sitemap을 제출하는 이유

이러한 SEO 작업의 기본 중의 기본(그렇지만 노력대비 효과도 좋은)은 검색엔진에 자신의 사이트 컨텐츠 중 크롤링 해야 하는 목록(sitemap)을 제출하는 것이다. 검색엔진은 기본적으로 웹 페이지내의 하이퍼링크를 찾고, 그 링크들을 통해 해당 사이트 내에 존재하는 웹페이지 목록을 알아내어 자신들의 검색 색인에 포함 시킨다.

웹사이트의 구성이나 내용에 따라서는 일부 페이지가 어떠한 하이퍼링크로 부터도 연결을 받지 못한 채 외톨이 상태가 될 수 있다. 뿐만 아니라 이 블로그와 같이 새로 생긴 웹사이트의 경우에는 그 웹사이트 자체를 가르키는 링크가 웹 상 어디에도 존재하지 않을 수 있기 때문에, 검색엔진이 사이트의 존재 자체를 알지 못할 수 있다.

sitemap은 이러한 문제를 해결하기 위한 용도로 고안되었는데, 간단히 원리는 약속된 특정한 양식을 통해 웹사이트의 운영자가 검색엔진에게 능동적으로 자신의 웹사이트 내에 존재하는 컨텐츠 들의 목록과 수정일, 변경 빈도 등을 알려주는 것이다.

Sitemap 만들기

sitemap은 미리 고안된 xml 양식으로 제작되어야 하며, 이 양식은 Google, Yahoo!, Microsoft(Bing)에 의해 지원된다. (Naver 등 국내 대부분의 검색엔진도 지원)

sitemap의 xml양식은 매우 간단한 수준 으로, 개발자라면 어렵지 않게 직접 개발도 가능하다. 하지만 검색 해보면, 대부분의 웹 개발 프레임워크에는 관련기능이 이미 구현되어 있고(eg. Django sitemap framework) WordPress에도 플러그인 형태로 이미 개발이 되어있어, 빠른 시간 안에 자신의 웹사이트에 sitemap.xml을 추가 할 수 있다.

아래는 이러한 방식으로 생성된 sitemap의 예이다.

http://www.foodb2b.kr/sitemap.xml (Django sitemap framework 사용)
http://54.150.211.139/sitemap.xml (WordPress Plugin 사용)

Sitemap 제출하기

이렇게 sitemap을 제작하였다면, 이제 제출 할 일만 남았다.

검색엔진에 따라 제출 방법이 다르지만, 우리나라 검색엔진 시장 특성 상 구글과 네이버  두개 검색엔진에만 제출 하면 충분하다.

구글은 웹서비스 운영자를 위한 검색 결과 최적화 도구인 구글 서치 콘솔(예전엔 구글 웹 마스터 도구 였음)을 제공하고 있고, 네이버도 얼마전에 이를 벤치마크 한듯한 네이버 웹마스터도구를 런칭하였다. 각 도구에서 sitemap제출 방법은 아래와 같다.

구글 서치 콘솔

  1. 구글 서치 콘솔 방문 후 본인 소유 구글 ID로 로그인
  2. 오른쪽 위 [속성 추가] 버튼을 클릭하여 추가하려는 웹사이트의 URL 추가g1
  3. Google Analytics, HTML 파일 업로드, Meta Tag 추가와 같은 방법으로 해당 사이트에 대한 본인의 소유권 증명
  4. 좌측 메뉴에서 [크롤링>Sitemaps] 클릭
  5. 우측 위 [SITEMAP 추가/테스트]버튼을 클릭하여 자신의 sitemap.xml url 입력
  6. [테스트]버튼을 누를 경우 해당 sitemap.xml에 오류가 없는지 점검해주며, 문제가 없을 경우 [제출]버튼을 클릭하여 제출g2
  7. 일정 시간이 지나면 위와 같이 sitemap.xml에 표시되는 컨텐츠 중 구글에 제출된 페이지가 표시됨

네이버 웹마스터 도구

  1. 네이버 웹마스터도구 에 네이버 ID를 통해 로그인
  2. 로그인 후 화면에서 [사이트 추가+] 버튼 클릭
  3. 프로토콜 및 URL 입력하여 사이트 추가
  4. HTML 파일 업로드, Meta Tag 추가와 같은 방법으로 해당 사이트에 대한 본인의 소유권 증명
    n1
  5. 좌측 [요청>사이트맵 제출] 클릭
  6. 표시되는 화면에서 자신의 sitemap.xml url 입력
  7. sitemap.xml 에 문제가 없을 경우 일정 등록이 되며, 일정 시간 이후 네이버 검색엔진에 의해 페이지가 수집됨