최근에 서버 디스크가 갑자기 꽉 차는 이슈가 있었음.
처음엔 “누가 또 큰 파일 던졌나?” 싶었는데 확인해보니 proxy_temp 디렉토리가 범인이었음.
🔍 원래 proxy_temp가 어떤 역할이냐면
- 클라이언트에게 파일 전송할 때 nginx가 임시로 파일을 저장하는 곳임
- 다운로드가 끝나면 바로 삭제되는 게 정상임
- 즉, 보통 여기에 오래 남는 파일은 없어야 함
❗ 그런데 이번엔 비정상 상황 발생함
- 다운로드가 중간에 끊기거나
- nginx worker가 파일 FD(파일 디스크립터)를 놓지 않는 상태가 됐던 듯함
- 즉, FD 누수(File Descriptor leak) 발생했음
- 그래서 삭제가 안 되고 계속 쌓임
📌 실제로 어떤 일이 벌어졌나
- proxy_temp 아래에 70MB짜리 파일이 수십 개씩 생김
- 심지어 삭제된 걸로 보이는데 실제로는 프로세스가 핸들을 붙잡고 있어서 물리 디스크에서 안 빠짐
- 결과적으로 디스크 사용량이 계속 올라감
🔧 해결된 계기
- 서비스 업데이트하면서 nginx 프로세스가 재시작됨
- 그 순간 worker가 붙들고 있던 FD가 해제됨
- 그제서야 proxy_temp 파일이 정상적으로 “진짜 삭제”됨
- 즉, nginx 재시작이 FD를 털어낸 셈
🤔 왜 이런 FD 누수가 났을까
- 이번 설정에서 nginx 버퍼링이 꽤 크게 잡혀 있었음
- 버퍼링 때문에 proxy_temp로 많이 쏟아졌고
- worker가 죽지 않으면 FD를 지속적으로 들고 있을 가능성이 있었음
- 그래서 이번에 버퍼링 옵션들 최소화함 (proxy_buffering off 등)
🧩 웃긴 포인트: messagebus가 파일을 잡고 있더라?
- lsof로 확인하니 messagebus라는 프로세스가 proxy_temp 파일을 붙잡고 있었음
- 근데 이건 진짜 메시지 버스 문제가 아니라
- overlay2가 middle layer에서 FD를 들고 있을 때 흔히 보이는 현상임
- overlay2가 복잡한 레이어 구조로 파일 system을 구성하다 보니
실제 파일을 어느 프로세스가 잡고 있는지 겉으로 다르게 보일 수 있음 - 이건 언제 한 번 제대로 구조 이해 필요함
📝 결론
- proxy_temp는 정상적으로는 바로 삭제되는 영역
- 비정상 종료 + FD 누수 때문에 쌓였던 것
- nginx 재시작으로 해소
- nginx 버퍼링은 최소로 조정 → 이후 같은 문제 확률↓
- overlay2 레이어 구조 때문에 messagebus가 잡고 있는 것처럼 보였음
'TIL' 카테고리의 다른 글
| Nginx 502 Bad Gateway 발생 원인 정리 (0) | 2025.11.26 |
|---|---|
| redis 남아있는 죽은 socket.id 정리하기. (0) | 2025.11.24 |
| 서버 CPU 픽 떠서 서버 에러율 높았던 사건 회고록 (0) | 2025.11.17 |
| Redis 한쪽노드에 메모리 몰린 경우 (0) | 2025.11.03 |
| Redis keys vs Scan 차이 (1) | 2025.11.02 |