GoAccess로 Nginx 접속 로그 분석하기 (방문자, 404, 구글봇)
구글 애널리틱스는 자바스크립트를 실행하는 방문자만 센다. 구글봇이 어떤 주소를 긁어 가는지, 어떤 IP가 서버를 두드리는지, 404가 얼마나 나는지는 서버의 접속 로그에만 남는다. 이 글에서는 Nginx 접속 로그를 터미널이나 HTML 보고서로 보여 주는 GoAccess 로그 분석 방법을 정리한다. 서치콘솔 쪽에서 본 색인 문제는 서치콘솔 색인 문제 해결에 정리해 두었다.

GoAccess 설치
# Ubuntu / Debian
sudo apt install goaccess
# Rocky / RHEL (EPEL)
sudo dnf install goaccess
goaccess --versionGoAccess 로그 분석 기본: 터미널 화면으로 보기
sudo goaccess /var/log/nginx/access.log --log-format=COMBINEDNginx 기본 로그 형식은 COMBINED다. 실행하면 방문자 수, 많이 본 주소, 404 주소, 방문 IP, 운영체제와 브라우저, 봇 목록, 상태 코드별 개수가 패널별로 나온다. 방향키와 Tab으로 이동하고 q로 나간다.
지난 로그까지 함께 보기
# logrotate 로 압축된 과거 로그까지 합쳐서
sudo zcat -f /var/log/nginx/access.log* | goaccess - --log-format=COMBINED로그 파일 위치와 회전 방식은 리눅스 로그 파일 위치와 logrotate 사용법에 정리했다.
GoAccess 로그 분석 보고서를 HTML로 만들기
sudo install -d -m 700 /root/goaccess-reports
sudo sh -c 'umask 077; goaccess /var/log/nginx/access.log --log-format=COMBINED -o /root/goaccess-reports/index.html'위 예시는 보고서를 기본 비공개 경로인 /root/goaccess-reports에 만들고 파일 접근 권한도 좁힌다. 필요한 경우 관리자 권한으로 안전하게 내려받아 로컬 브라우저로 열자. 다만 접속 IP와 주소가 그대로 담기므로 아무나 볼 수 있는 경로에 두면 안 된다. 웹에서 봐야 한다면 공개 경로로 옮기기 전에 Nginx 기본 인증(auth_basic)이나 IP 제한을 먼저 설정하고, 비로그인 요청이 거부되는지 확인한다. 보고서를 매일 새로 만들고 싶다면 crontab에 위 명령을 등록한다.
봇과 구글봇 트래픽 확인
GoAccess의 “Crawlers” 패널에 주요 봇이 따로 집계된다. 특정 봇이 어떤 주소를 가져가는지 더 자세히 보려면 로그를 직접 걸러 본다.
# Googlebot 이 가장 많이 요청한 주소
grep 'Googlebot' /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -nr | head
# Googlebot 요청 중 404 가 난 주소
grep 'Googlebot' /var/log/nginx/access.log | awk '$9 == 404 {print $7}' | sort | uniq -c | sort -nr | headawk 명령은 sed awk 사용법에서 자세히 다뤘다. 사용자 에이전트는 누구나 흉내 낼 수 있으니, 진짜 구글봇인지 확인하려면 IP를 역방향 조회한 뒤 정방향 조회로 원래 IP와 일치하는지도 확인한다. 일반 Googlebot은 googlebot.com 또는 그 하위 도메인인지 확인하며, 다른 Google 도구는 공식 문서의 해당 분류를 따른다. Google이 소유한 IP라는 사실만으로 검색용 Googlebot이라고 단정하지 않는다.
host 66.249.66.1GoAccess 로그 분석에서 실제 Googlebot만 구분하기
앞의 grep 결과는 이름에 Googlebot이 든 요청을 찾는 1차 목록이다. User-Agent는 위조할 수 있고 이미지·CSS·자바스크립트 요청도 섞이므로, 이 수치를 글 본문 수집 횟수나 색인 수로 사용하면 안 된다. 같은 IP가 robots.txt만 확인한 경우도 글을 읽어 간 것은 아니다.
# 예시는 실제 로그에서 확인한 Google 크롤러 IP
host 34.64.82.64
# 역방향 결과: geo-crawl-34-64-82-64.geo.googlebot.com
host geo-crawl-34-64-82-64.geo.googlebot.com
# 정방향 결과에 원래 IP 34.64.82.64가 있는지 확인대량 분석은 Google 공식 IP 목록과 검증 절차를 사용한다. Googlebot, Googlebot-Image, GoogleOther, Google-InspectionTool은 역할이 다르다. 특히 실시간 검사 뒤 생긴 Google-InspectionTool 기록은 일반 검색 크롤러의 자발적인 재방문이나 색인 완료로 세지 않는다.
이 블로그의 10월 점검에서는 공식 IP 목록으로 검증한 요청만 따로 집계했다. 이처럼 날짜·정확한 글 주소·상태 코드·크롤러 종류를 묶어 확인하면, 방문 흔적과 검색 색인을 혼동하는 일을 줄일 수 있다. 결과 해석은 서치콘솔 색인 상태 점검에서 이어서 볼 수 있다.
GoAccess 로그 분석 결과 활용
- 404 주소: 옛 주소라면 301 리디렉션을 건다(한글 URL 리디렉션 404 문제).
- 특정 IP의 과도한 요청: 로그인 시도나 크롤링 공격이라면 방화벽이나 fail2ban으로 막는다(fail2ban 설정).
- 많이 읽히는 글: 내부 링크를 보강하고 내용을 최신으로 유지한다.
- 큰 응답: 용량이 큰 이미지나 파일을 찾아 압축한다.
로그에서 wp-login.php나 xmlrpc.php에 반복 요청이 보이면 워드프레스 보안 설정도 함께 점검하자.
옵션 전체와 실시간 HTML 보고서 설정은 GoAccess 공식 사이트에서 볼 수 있다.
마무리
서치콘솔이 “구글이 본 내 사이트”라면 서버 로그는 “실제로 들어온 모든 요청”이다. 한 달에 한 번 GoAccess로 로그를 훑어보면 404, 봇, 이상한 요청을 일찍 발견할 수 있다. 서버 자원 상태를 보는 방법은 전날 글인 리눅스 서버 모니터링에 있다.
첫 댓글을 남겨보세요