예상 못한 10만 명 접속 사이트 로그 확인하기

정혜인·2025년 6월 30일
3

UX 해적단 사이트는 처음부터 접속자 추적을 염두에 두고 만들었던 프로젝트가 아니었습니다.

그래서 당연히(?) CloudWatch도 설치하지 않았고, Google Analytics도 연동하지 않았습니다.

그런데 어느 날 갑자기... X에서 예상치 못하게 바이럴을 타게 되었다는 PM의 연락을 받게 되었습니다.

(그 와중에 프로젝트 당사자들 모두 X 해본 적도 없는.... 황당한 상황...)

사실 연락 오는 거 보자마자 심장 철렁해서 서버 확인부터 해본 사람...

서론이 길었는데 이렇게 갑자기 유명해졌다고 하니 실제로 서비스 사용자가 얼마나 되는지 궁금해졌고,

접속자 수를 전혀 추적하고 있지 않던 상황에서 뒤늦게라도 접속자 수를 추정하려 방법을 찾아본 기록입니다.

🐳 Docker로 띄운 Nginx, 로그는?

먼저 확인한 것은 Nginx의 access 로그였습니다. 하지만 저는 이 서비스를 Docker 컨테이너로 띄워놓고 있었고, 당연히 /var/log/nginx/access.log 같은 경로는 존재하지 않았습니다.

대신 Nginx 로그는 모두 stdout으로 출력되고 있었고, 다행히 아래 명령어로 Docker 로그를 바로 확인할 수 있었습니다.

docker logs <nginx-container-id>

이 명령어로 나오는 로그 중 HTTP 요청만 필터링하고 싶다면 아래 명령어를 사용할 수 있습니다.

docker logs <nginx-container-id> | grep -E '"(GET|POST|PUT|DELETE|HEAD)' | wc -l

이 명령어는 총 HTTP 요청 수를 보여줍니다. 즉, 대략적인 총 접속 수를 알 수 있습니다.

이렇게 명령어를 입력하니 생각보다 너무 많은 응답이 나왔고, 이게 실질적인 접속자 수를 나타낸다고 보기에는 어려움이 있겠다는 생각이 들어 다른 방법을 찾아보았습니다.

제가 궁금했던 건 우선 고유한 접속자 수였기 때문에, 접속한 IP를 기준으로 접속자를 구분할 수 있겠다는 생각이 들었고, 아래 명령어로 접속 ip 수를 출력받았습니다.

docker logs <nginx-container-id> | awk '{print $1}' | sort | uniq | wc -l

👀 텍스트 로그... 없어보인ㄷ...

명령어로 숫자를 뽑는 것만으로는 아쉬움이 남았습니다.
위의 명령어를 치면 딱 숫자만 나온다는 게 솔직히 말하면... 없어보였습니다....

특히 정확하지는 않더라도 구체적인 수치를 기획자 분께 공유해드리고 싶었는데, (linkedin에 공유할 거라고 하셨음.. + 공유한 링크드인) 시각적인 리포트를 함께 공유하면 훨씬 좋아보일 것이라고 생각했기 때문에, 조금 더 알아보다가 goaccess라는 로그 분석 도구를 발견하게 되었습니다.

📈 goaccess로 접속 리포트 시각화하기

goaccess는 CLI 기반의 로그 분석 도구지만, 꽤 괜찮은 HTML 리포트를 만들어줍니다.

아래 명령어로 ec2 터미널에서 설치해주고,

sudo apt update

sudo apt install goaccess

Docker 컨테이너의 로그를 .log 파일로 저장합니다. (만약 docker 컨테이너를 사용하지 않았다면 그냥 nginx 로그를 사용하면 됩니다)

docker logs <nginx-container-id> > nginx-access.log

그 후, 이 로그 파일을 goaccess에 분석시키고 HTML 리포트를 생성하면 됩니다.

goaccess nginx-access.log -o access-report.html --log-format=COMBINED

🌐 EC2에서 HTML 파일 띄우기

생성된 access-report.html 파일을 웹으로 서빙해서 링크만 PM 분께 보내드리면 직접 세세하게 확인 후에 필요한 정보만을 캡처할 수 있을 것 같아 ec2 서버로 띄우려 했습니다. 저는 이 리포트를 잠깐 보기만 하면 되는 목적이었기 때문에 Nginx에 서빙하지 않고 Python 내장 웹서버를 사용했습니다. ((물론 보안 문제가 있기 때문에 정말 잠깐만 확인 용도로 사용하였습니다))

cd /home/ubuntu   # access-report.html이 있는 위치로 이동

python3 -m http.server {포트번호}

그리고 AWS EC2 보안 그룹에서 해당 포트를 인바운드 규칙에 추가해준 후,

http://<EC2 퍼블릭 IP>:{포트번호}/access-report.html

로 접속하니 아주 잘 나타났습니다. 쉽게 링크로 공유할 수 있었고, 시각적으로 확실하게 확인할 수 있다는 점이 큰 장점이었던 것 같습니다.

실제로 보안 때문에 캡처할 수는 없지만 디바이스 별 접속 량, 접속 경로 등을 모두 확인할 수 있었습니다! (물론 nginx 기반 로그이기에 정확하지는 않을 수 있습니다.)


(만약 포트 종료를 하고 싶다면)

ps aux | grep http.server

후에 나오는 PID를 sudo kill {PID} 해주면 됩니다.

내가 맨날 까먹어서 적어두는 거 절대 아님

🧼 but, 로그는 3개월만...

goaccess 리포트를 보면서 한 가지 아쉬운 점이 있었습니다.

최근 약 3개월치의 로그만 확인이 가능했던 것입니다.

이는 Docker 컨테이너의 로그가 기본적으로 일정 용량을 넘기면 자동으로 오래된 로그가 삭제되는 구조이기 때문이었습니다.
(로그를 확인하게 될 줄은 상상도 못했던 과거...)

Docker는 기본적으로 /var/lib/docker/containers/... 내부에 로그를 저장하고, 그 용량이 쌓이면 오래된 로그를 버립니다.

그래서 3개월 전의 접속 로그는 확인할 수 없었고,,,, 이건 포기하기로 했습니다....

이 상황을 통해, 초기부터 로그 보존 정책을 수립해두는 것이 얼마나 중요한지 실감하게 되었습니다.

🗃 앞으로를 위한 자동화 스크립트 만들기

비록 과거의 로그는 잃었지만, 앞으로의 기록이라도 잘 저장하기 위해 자동화 스크립트를 만들었습니다.

접속 로그를 특정 기간마다 한 번씩 저장하고, 이를 git에 백업해두는 방식입니다. 다른 스토리지를 따로 쓰기에는 금액 부담이 있었고, 무료로 계속해서 업데이트 해둘 수 있는 가장 효율적인 곳이 git이라 판단했습니다. (물론 당연히 private)

#save-logs.sh
#!/bin/bash

TODAY=$(date +%F)

CONTAINER_NAME=nginx

REPO_DIR=/home/ubuntu/ux-study-web

LOG_DIR=$REPO_DIR/nginx-log

LOG_FILE=$LOG_DIR/$TODAY-access.log

mkdir -p $LOG_DIR

docker logs --since "24h" $CONTAINER_NAME > $LOG_FILE

cd $REPO_DIR

git pull origin main

git add $LOG_FILE

git commit -m "chore: save nginx logs for $TODAY"

git push origin main

그리고 이 스크립트를 crontab에 등록해, 특정 기간마다 자동으로 실행되도록 설정했습니다.

crontab -e

예를 들어 하루마다 자정에 저장한다고 하면 아래와 같이 등록해주면 됩니다.

0 0 * * * /home/ubuntu/save-logs.sh >> /home/ubuntu/save-logs.log 2>&1

처음에는 “그냥 작게 시작해 보자”는 마음이었고, 접속자 추적은 전혀 생각도 못했습니다.

그런데 예상하지 못한 관심과 반응 덕분에, 로그 분석이라는 기술적인 보완이 필요해졌습니다.

결국 CloudWatch, ELK, GA, 로그 정책 같은 것들을 초기부터 설계해두는 것이 얼마나 중요한지를 뼈저리게 느꼈습니다. 적어도 docker log 저장 기간이라도 늘려두었다면... 이전 로그들을 복구할 수 있었을텐데 하는 아쉬움이 너무 컸습니다... (내 아까운 로그들..(?) 이라는 생각이 계속 드는..)

하지만 그와 동시에, 당장 아무것도 세팅되어 있지 않아도, 단순한 텍스트 로그와 도구만으로도 충분히 의미 있는 데이터를 확인할 수 있다는 것도 느꼈습니다.

혹시나 이렇게 갑자기 접속 로그가 궁금해지는 날이 온다면, nginx 로그만으로도 충분히(?) 급한 내용은 얻을 수 있다는 걸... 느끼게 되었슴니다^_^

0개의 댓글