nginx: 로그 때문에 서버 용량이 찼을 때 처리 방법

발생일: 2017.07.31

키워드: nginx, 용량, 로그 용량, copytruncate, logrotate, 로그 로테이트

문제:
서버 용량이 가득 차서 리스타트에 실패하는 문제가 발생했다.
nginx 로그 때문으로 추측되는데, 실제로 로그 디렉토리 내의 로그 파일의 용량은 문제가 될 만큼 크지 않다.

뭐가 문제일까?


해결책:

nginx 로그는 로테이트해 S3로 업로드한 후에 삭제한다.
확인해보니, 원인은 로그가 제대로 로테이트되지 않고 프로세스가 삭제된 기존 파일을 계속 물고 있었기 때문이다.
로그 로테이트 옵션에 copytruncate 을 추가하는 것으로 해결했다.

아래는 작업과 관련된 스크립트:

# 현재 머신의 용량을 확인해본다
df -h

# 어떤 디렉토리에서 가장 많이 차지하는지 확인한다
sudo du -hs * | sort -hr | head -n 10

# nginx 프로세스가 삭제된 파일을 물고 있는지 확인한다 (이게 원인이었음)
lsof / | grep deleted

# nginx 리로드해서 삭제된 물고 있는 파일을 정리한다
sudo /etc/init.d/nginx reload

# nginx 로그로테이트 설정 파일 보기
sudo cat /etc/logrotate.d/nginx

# nginx 로그로테이트 설정 파일에 copytruncate을 추가했다
sudo vi /etc/logrotate.d/nginx

# 디버깅 모드로 로그로테이트 실행하기
sudo logrotate -d /etc/logrotate.d/nginx

# 강제로 로그로테이트 실행하기
sudo logrotate -f /etc/logrotate.d/nginx


논의:

du + sort 로 읽기 편한 사이즈로 표시하면서 정렬하는 방법

로그 용량이 기가 단위로 큰 경우엔 copytruncate 동작 중 I/O 블로킹으로 인한 타임아웃이 발생할 수 있다고 한다.



카테고리

분류 전체보기 (710)
About me. (6)
Daylogs (675)
영어공부 (0)
My works - 추억 (29)
비공개 (0)