본문 바로가기

WEB-SERVER/OHS & JBCS & Apache

[JBCS] Apache rotatelogs 설정(CustomLog 예시)

728x90

아래와 같이 CustomLog를 작성해주면 된다.

설정의 의미는 SSL에 쓰일 수 있는, SSL Protocol과 CIPHER 정보를 보기위해 사용하는 rotatelogs 설정이다.

CustomLog "|${JBCS_HOME}/httpd/sbin/rotatelogs /DATA/LOG/test-ssl-request_log.%Y%m%d 86400 +540" "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b %D"

 

해당 로그 설정의 경우, syntax ERROR을 내더라도 httpd 서비스 자체는 문제 없이 기동된다.

하지만, 해당 설정에 대해서 syntax Error로 인하여 서비스 HANG 현상이 발견될 수도 있다.

🔴 Hang이 발생할 수 있는 시나리오

1. rotatelogs 프로세스 비정상 종료 → 파이프 블로킹

Apache Worker → pipe → rotatelogs 프로세스
  • rotatelogs가 잘못된 인자로 인해 즉시 종료되면
  • Apache 워커가 로그를 파이프에 write() 하려다 SIGPIPE 또는 블로킹 발생
  • 요청 처리 중 로그 write가 블로킹되면 → 해당 워커 스레드/프로세스가 hang

2. 파이프 버퍼 포화 (Pipe Buffer Full)

  • rotatelogs가 죽거나 느려지면 파이프 버퍼(보통 64KB)가 가득 참
  • Apache는 버퍼가 빌 때까지 write() 에서 무한 대기
  • 워커가 모두 여기서 막히면 → 전체 서비스 hang처럼 보임

3. 파일명 패턴 문제로 rotatelogs 반복 재시작

bash
# +540 뒤에 %t %h 등이 인자로 붙는 경우
rotatelogs ... 86400 +540 [27/Apr/2026:12:00:00 +0900] 192.168.x.x ...
  • rotatelogs가 알 수 없는 인자로 즉시 exit → Apache가 재시작 → 또 exit 반복
  • 이 과정에서 파이프 열고 닫기가 폭풍처럼 반복되어 부하 유발

🟡 Hang까지는 아니지만 장애로 이어지는 시나리오

상황영향
rotatelogs 계속 죽고 재시작 CPU/FD(파일디스크립터) 고갈
로그 write 지연 누적 응답 지연 (Latency 증가)
워커 프로세스 고갈 신규 요청 거부 (503)

 

 

나만 이런 현상을 겪는건가 싶어서 검색을 해보니, rotatelogs로 인해 HANG 현상을 겪은 글들이 몇몇 보였다.

아래의 글들은 syntax 에러는 아닌듯 싶지만, rotatelogs에 의해 HANG 현상이 목격된 것으로 보여

같이 첨부해본다.

 

===========

https://www.apachelounge.com/viewtopic.php?t=8558

https://github.com/owasp-modsecurity/ModSecurity/issues/2822

 

ModSecurity can cause hang of apache httpd during graceful restart · Issue #2822 · owasp-modsecurity/ModSecurity

Describe the bug When modsec is configured to pipe logs to different process (like rotatelogs for example) it can cause hang of apache httpd during graceful restart. When SecAuditLog directive is s...

github.com

===========

 

Apache에서 rotatelogs를 piped log로 사용할 경우, 설정 파일의 Syntax Error로 인한
httpd 프로세스 기동과 중단이 원활하지 않을 순 있다. 그러나 해당 설정의 이슈가 기동 후 서비스의 지연과 같은 이슈에 대해
직접적으로 영향을 미치는 원인으로 보기엔 어려울 수 있다.
다만 유사한 사례의 내용을 토대로 볼 때, rotatelogs 프로세스가 중단되거나
비정상 상태(e.g syntax error 발생)가 되어 pipe를 정상적으로 읽지 못하면,
pipe buffer가 포화되고, httpd child/thread가 로그 write() 호출에서 블로킹될 수 가능성이 존재할 수 있다.
 
이로 인해 일부 요청 처리 thread가 반환되지 않고 누적되며,
최종적으로 Apache hang 또는 worker 고갈 현상으로 이어질 수 있다.

결국은 mpm에서 childprocess 값을 늘려도 의미가 없다는 것이다. 마치 OutofMemoryError 같은 거다.