Nginx 로그 분석 및 최적화

LinuxBeginner
지금 연습하기

소개

이 프로젝트에서는 Nginx 서버의 액세스 로그에 대한 로그 분석을 수행하는 방법을 배우게 됩니다. 로그에서 액세스 횟수가 가장 많은 IP 주소, 서버에 최소 10 번 이상 액세스한 IP 주소, 가장 많이 액세스된 요청, 404 상태의 요청 주소 등과 같은 귀중한 정보를 검색합니다.

🎯 과제

이 프로젝트에서 다음을 배우게 됩니다:

  • 특정 날짜의 액세스 횟수가 가장 많은 5 개의 IP 주소를 검색하는 방법
  • 주어진 날짜 범위 내에서 서버에 최소 10 번 이상 액세스한 모든 IP 주소를 찾는 방법
  • 정적 파일 및 리소스를 제외하고 로그 파일에서 가장 많이 액세스된 10 개의 요청을 검색하는 방법
  • 로그 파일에서 404 상태의 모든 요청 주소를 작성하는 방법

🏆 성과

이 프로젝트를 완료하면 다음을 수행할 수 있습니다:

  • Nginx 액세스 로그에서 의미 있는 정보를 분석하고 추출합니다.
  • 쉘 스크립팅을 사용하여 로그 분석 작업을 자동화합니다.
  • 필터링, 정렬 및 계산과 같은 일반적인 로그 분석 기술을 이해하고 적용합니다.
  • 분석 결과를 구조화된 방식으로 관리하고 구성합니다.

2015 년 4 월 10 일, 가장 많은 액세스를 기록한 5 개의 IP 주소 검색

이 단계에서는 2015 년 4 월 10 일의 access.log 파일에서 액세스 횟수가 가장 많은 5 개의 IP 주소를 검색하는 방법을 배우게 됩니다. 이 단계를 완료하려면 아래 단계를 따르세요:

  1. 터미널을 열고 /home/labex/project 디렉토리로 이동합니다.
  2. 다음 명령을 사용하여 2015 년 4 월 10 일의 액세스 횟수가 가장 많은 5 개의 IP 주소를 검색합니다:
grep '10/Apr/2015' access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -5 | awk '{print $2}' > output1

이 명령은 다음을 수행합니다:

  • grep '10/Apr/2015' access.log: 로그 파일을 필터링하여 2015 년 4 월 10 일의 줄만 포함합니다.
  • awk '{print $1}': 각 로그 줄에서 IP 주소 (첫 번째 필드) 를 추출합니다.
  • sort: IP 주소를 정렬합니다.
  • uniq -c: 각 IP 주소의 발생 횟수를 계산합니다.
  • sort -rn: IP 주소를 횟수별로 내림차순으로 정렬합니다.
  • head -5: 상위 5 개의 IP 주소를 선택합니다.
  • awk '{print $2}': 정렬되고 계산된 출력에서 IP 주소 (두 번째 필드) 를 추출합니다.
  • > output1: 출력을 output1 파일로 리디렉션합니다.
  1. output1 파일의 내용을 확인하여 2015 년 4 월 10 일의 액세스 횟수가 가장 많은 5 개의 IP 주소가 한 줄에 하나의 IP 주소로, 빈 줄 없이 포함되어 있는지 확인합니다.
216.244.66.249
216.244.66.231
140.205.225.185
140.205.201.39
140.205.201.32

2015 년 4 월 11 일, 서버에 최소 10 번 이상 액세스한 모든 IP 주소 찾기

이 단계에서는 2015 년 4 월 11 일 사이에 서버에 최소 10 번 이상 액세스한 모든 IP 주소를 찾는 방법을 배우게 됩니다. 이 단계를 완료하려면 아래 단계를 따르세요:

  1. 다음 명령을 사용하여 2015 년 4 월 11 일 사이에 서버에 최소 10 번 이상 액세스한 모든 IP 주소를 찾습니다:
grep '11/Apr/2015' access.log | awk '{print $1}' | sort | uniq -c | awk '$1 >= 10 {print $2}' > output2

이 명령은 다음을 수행합니다:

  • grep '11/Apr/2015' access.log: 로그 파일을 필터링하여 2015 년 4 월 11 일의 줄만 포함합니다.
  • awk '{print $1}': 각 로그 줄에서 IP 주소 (첫 번째 필드) 를 추출합니다.
  • sort: IP 주소를 정렬합니다.
  • uniq -c: 각 IP 주소의 발생 횟수를 계산합니다.
  • awk '$1 >= 10 {print $2}': 횟수가 10 이상인 IP 주소를 필터링하고 IP 주소 (두 번째 필드) 를 출력합니다.
  • > output2: 출력을 output2 파일로 리디렉션합니다.
  1. output2 파일의 내용을 확인하여 2015 년 4 월 11 일 사이에 서버에 최소 10 번 이상 액세스한 모든 IP 주소가 한 줄에 하나의 IP 주소로, 빈 줄 없이 포함되어 있는지 확인합니다.
108.245.182.93
123.127.3.30
140.205.201.39
216.244.66.231
216.244.66.249
218.75.230.17

로그 파일에서 가장 많이 액세스된 상위 10 개 요청 검색

이 단계에서는 정적 파일, 이미지 또는 유사한 리소스를 제외하고 access.log 파일에서 가장 많이 액세스된 10 개의 요청을 검색하는 방법을 배우게 됩니다. 이 단계를 완료하려면 아래 단계를 따르세요:

  1. 다음 명령을 사용하여 로그 파일에서 가장 많이 액세스된 10 개의 요청을 검색합니다:
grep -vE '(/robots.txt|\.js|\.css|\.png)' access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -10 | awk '{print $2}' > output3

이 명령은 다음을 수행합니다:

  • grep -vE '(/robots.txt|\.js|\.css|\.png)' access.log: /robots.txt, .js, .css, 또는 .png를 포함하는 줄을 제외하도록 로그 파일을 필터링합니다.
  • awk '{print $7}': 각 로그 줄에서 요청 주소 (일곱 번째 필드) 를 추출합니다.
  • sort: 요청 주소를 정렬합니다.
  • uniq -c: 각 요청 주소의 발생 횟수를 계산합니다.
  • sort -rn: 요청 주소를 횟수별로 내림차순으로 정렬합니다.
  • head -10: 상위 10 개의 요청 주소를 선택합니다.
  • awk '{print $2}': 정렬되고 계산된 출력에서 요청 주소 (두 번째 필드) 를 추출합니다.
  • > output3: 출력을 output3 파일로 리디렉션합니다.
  1. output3 파일의 내용을 확인하여 로그 파일에서 가장 많이 액세스된 10 개의 요청이 한 줄에 하나의 요청 주소로, 빈 줄 없이 포함되어 있는지 확인합니다.
/
/j_acegi_security_check
/favicon.ico
400
/xref/linux-3.18.6/
/pmd/index.php
/pma/index.php
/phpMyAdmin/index.php
/phpmyadmin/index.php
check.best-proxies.ru:80

로그 파일에서 404 상태의 모든 요청 주소 기록

이 단계에서는 access.log 파일에서 404 상태의 모든 요청 주소를 output4 파일에 쓰는 방법을 배우게 됩니다. 이 단계를 완료하려면 아래 단계를 따르세요:

  1. 다음 명령을 사용하여 로그 파일에서 404 상태의 모든 요청 주소를 output4 파일에 씁니다:
grep ' 404 ' access.log | awk '{print $7}' | sort | uniq > output4

이 명령은 다음을 수행합니다:

  • grep ' 404 ' access.log: 404 상태 코드를 포함하는 줄만 포함하도록 로그 파일을 필터링합니다.
  • awk '{print $7}': 각 로그 줄에서 요청 주소 (일곱 번째 필드) 를 추출합니다.
  • sort: 요청 주소를 정렬합니다.
  • uniq: 중복된 요청 주소를 제거합니다.
  • > output4: 출력을 output4 파일로 리디렉션합니다.
  1. output4 파일의 내용을 확인하여 로그 파일에서 404 상태의 모든 요청 주소가 한 줄에 하나의 요청 주소로, 중복 없이 포함되어 있는지 확인합니다.
/about/
/cgi?2
/cgi-bin/cgiSrv.cgi
/clusters.jsf
/dfshealth.jsp
/dnieyraqcvtu
/favicon.ico
/ganglia/index.php
/hadoop/dfshealth.jsp
/history/linux-3.18.6/arch/ia64/include/asm/processor.h
/history/linux-3.18.6/arch/m68k/amiga/
/history/linux-3.18.6/arch/m68k/kernel/
/history/linux-3.18.6/arch/s390/include/asm/lowcore.h
/history/linux-3.18.6/arch/s390/kernel/entry64.S
/history/linux-3.18.6/arch/tile/kernel/intvec_64.S
/history/linux-3.18.6/arch/unicore32/include/asm/thread_info.h
/history/linux-3.18.6/arch/unicore32/include/asm/unistd.h
/history/linux-3.18.6/arch/x86/include/asm/processor.h
/history/linux-3.18.6/arch/x86/include/asm/unistd.h
/history/linux-3.18.6/arch/x86/kernel/entry_64.S
    ...

요약

축하합니다! 이 프로젝트를 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 기술을 향상시킬 수 있습니다.

✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습