개발

도커 내부에서 nginx 돌릴때 호스트에서 logrotate 적용하는법

이번에도 나한테만 일어났던 그지같은 문제상황이라...
기록겸 남겨놓는다.

나는 docker 환경에서 프록시 서버를 구현해두고 그 프록시서버가 내부의 nginx 컨테이너들에 http 요청을 건네주는 원서버 다중웹사이트 구조로 웹 서비스를 제공하고있다.

이러다보니 실제 도커가 돌아가는 서버는 그냥 http 요청이 들어오면 도커의 프록시 서버로 포트포워딩만 해주는 상태고 실제 nginx 서버구동이나 환경은 도커내에서 운영이된다.

다만 이 도커내에서 운영되는것 때문에 일반적인 서버 제어 설정이 안되는 문제가 발생한다.
그렇게 때문에 항상 docker exec 명령어를 통해서 한번 건너서 서버설정을하다보니까 일반적인 해결방법을 바로 적용하지못하고 여러 문제를 야기하기도한다.


본 작업에서 발생한 문제는 다름이아니라 로그로테이트(logrotate) 작업을 돌리는데 문제가 발생했다.
웹서버를 운용하다보면 수많은 접속 로그가 /var/log/nginx/access.log에 쌓이게되는데, 이게 너무 과도하게 쌓여버리면 로그파일로만 몇기가를 먹기도 한다.
그렇다고 이걸 일일히 아카이빙하는것도 좀 고역인 상황.
이럴때 특정주기마다 로그가 알아서 밀리게 하는 기능인 로그로테이트를 적용하므로써 적정량의 로그 보관 관리 기법을 적용할 수 있는 아주좋은 리눅스 내장 로그관리 기법이다.

나도 아래처럼 /etc/logrotate.d/nginx 파일을 만들고 로그를 돌려서 저장하고있다.

/var/log/nginx/*.log {
    daily
    missingok
    rotate 365
    compress
    delaycompress
    notifempty
    create 0644 root root
    sharedscripts
    postrotate
        cd /home/ubuntu/docker && /usr/local/bin/docker-compose exec -T proxy nginx -s reopen
    endscript
}
Copy

근데 여기서 문제가 발생했던건 postrotate - endscript 이 부분에서의 일이었다.
통상적으로 이 로그로테이트가 도는 호스트와 실제 웹서버가 도는 호스트가 같아서 손쉽게 nginx -s reopen 만 해줘도 되는데 나는 이걸 도커를 사용하다보니까 위에처럼 좀 비틀어서 도커런을 돌려야하는 문제가 있었다.

특히나 위 로그로테이트의 경우 터미널 자체의 환경변수가 작동을 안하는 환경이라 docker-compose를 실행시킬때 /usr/local/bin 이 경로를 꼭 지정해줘야한다는걸 몇번의 삽질을 통해서 알게되었다.

참 알고나면 간단한 문제면서도 막상문제가 터졌을땐 뭐 어찌할지몰라서...
답답한 마음에 이렇게 글을 남겨본다.


#문제해결 #Nginx #Ubuntu
0 개의 댓글
×