본문 바로가기

Compute/ELB

AWS ELB 사용 시 Apache 408/503 error log

AWS ELB와 Apache 사용 시 Apache의 Access Log에 408/50X 에러 로그가 발생되는 경우가 있다.

이 증상은 ELB의 idle timeout과 Apache의 mod_reqtimeout 모듈과의 충돌로 발생된다. 

ELB의 idle timeout은 Back-end EC2 Instance와 세션 유지를 위한 timeout 시간이며, mod_reqtimeout은 웹 서버 보안 모듈이다.

 

1. ELB Idle timeout까지 ELB는 Back-end EC2 Instance와 TCP 세션 유지

2. mod_reqtimeout은 일정 시간(default 20~40초)이 경과해도 probe를 보내지 않는 세션을 공격으로 간주하고 차단(408 에러 발생)

3. ELB Idle timeout은 기본적으로 60초로 mod_reqtimeout 보다 길기 때문에 공격으로 간주

 

따라서 mod_reqtimeout 사용을 하지 말거나, ELB의 Idle timeout을 mod_reqtimeout의 시간보다 줄여야 함.

참고

 

mod_reqtimeout - Apache HTTP Server Version 2.5

Apache Module mod_reqtimeout Summary This module provides a convenient way to set timeouts and minimum data rates for receiving requests. Should a timeout occur or a data rate be to low, the corresponding connection will be closed by the server. This is lo

httpd.apache.org

 

Back-End의 세션 timeout보다 ELB의 세션 timeout 시간이 더 짧아야 한다. 

 

기타 자매품 문제로 ELB는 file length가 없습니다. 그래서 파일을 업로드 하다가 60초 이상 sleep(멈춤, 중지) 하고, 재업로드 시에 에러가 발생되는 문제도 있다. 60초까지는 괜찮다.

 

추가로 CloudFront, API Gateway와 같은 End point 서비스를 Proxy 형태로 사용할 리는 없지만... 저 서비스들의 TCP Keep Alive 시간은 45초이다. (AWS 공식은 아니고, 테스트 시 나온 내용임을 참고)