Profile picture

웹 서버 트러블슈팅 #1 - 자주 일어나는 장애 유형 파악하기

JaehyoJJAng2023년 02월 22일

◾️ 서버 상태 점검

▪️ web

1. nginx 포트 확인

sudo netstat -nltpu | grep '80'

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1789/docker-proxy
tcp6       0      0 :::80                   :::*                    LISTEN      1793/docker-proxy

2. nginx 프로세스 확인

ps -ef | grep 'nginx' | grep -v 'grep'

root        1854    1816  0 00:43 ?        00:00:00 nginx: master process nginx -g daemon off;
101         1977    1854  0 00:43 ?        00:00:00 nginx: worker process

▪️ db

1. mysql 포트 확인

sudo netstat -nltpu | grep '3306'

tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      1782/docker-proxy
tcp6       0      0 :::3306                 :::*                    LISTEN      1786/docker-proxy

2. mysql 프로세스 확인

ps -ef | grep 'mysql' | grep -v 'grep'

systemd+    1823    1802  0 00:43 ?        00:00:02 mysqld

▪️ NFS 서버

1. nfs 포트 확인

sudo netstat -nltpu | grep '2049'

tcp        0      0 0.0.0.0:2049            0.0.0.0:*               LISTEN      -
tcp6       0      0 :::2049                 :::*                    LISTEN      -

2. nginx 프로세스 확인

ps -ef | grep 'nfs' | grep -v 'grep' | grep -v '^nfs' # nfs 유저로 띄워진 프로세스는 제외.

root         704       1  0 00:42 ?        00:00:00 /usr/sbin/nfsdcld
root        1269       2  0 00:42 ?        00:00:00 [nfsd]
root        1272       2  0 00:42 ?        00:00:00 [nfsd]
root        1275       2  0 00:42 ?        00:00:00 [nfsd]
root        1277       2  0 00:42 ?        00:00:00 [nfsd]
root        1279       2  0 00:42 ?        00:00:00 [nfsd]
root        1281       2  0 00:42 ?        00:00:00 [nfsd]
root        1283       2  0 00:42 ?        00:00:00 [nfsd]
root        1285       2  0 00:42 ?        00:00:00 [nfsd]
root        1800     901  0 03:12 ?        00:00:00 sshd: nfs [priv]

◾️ 셸 스크립트

  • 웹 서버 트러블슈팅용 셸 스크립트 작성

▪️ 시나리오

  • 홈페이지 오픈
  • 다같이 축하하며 맥주 한잔
  • 다음날 출근해서 웹 서버 로그 확인하는데 에러가 잔뜩?!

▪️ 자주 일어나는 장애유형

웹 서버에서 자주 일어나는 장애 유형에 대해 알아보자.


  • Disk Full
    • 로그를 기록하는 프로세스가 에러 또는 멈춘다
    • 임시 파일을 생성해야 하는 명령어의 실행이 안된다: 로그를 기록할 수 있는 공간이 없음
    • 리눅스는 루트 유저만을 위한 예약 블록을 남겨두어 트러블슈팅이 가능하도록 설계: 디스크가 풀이 되어도 예약 블록은 쓰지 않음
  • 메모리 풀
    • 메모리를 다 쓰고 스왑 영역까지 끌어써서 시스템이 느려짐. 당연히 유저에게 응답또한 느려지게 될 것임
  • 시스템 부하
    • 로드 에버리지가 cpu 코어 개수보다 높은 경우 유저 요청에 대한 응답 늦어짐
  • 프로그램 문제
    • 프로그램 오동작

▪️ 한 줄 스크립트 핵심 키워드

키워드 내용 예제
파이프라인 (|) 앞 명령어의 결과를 뒤 명령어의 입력으로 전달 `ls -lh
세미콜론 (;) 단일 명령실행 uptime; df -h
AND 조건 (&&) 조건이 참이면 다음 명령어 실행 [[ 1 == 2 ]] && echo 'true'
OR 조건 (||) 조건이 거짓이면 다음 명령어 실행 `[[ 1 == 2 ]]

◾️ 장애 상황 만들기

dd 명령어로 디스크 full 상황 만들기

dd if=/dev/zero of=test.txt bs=1G count=49

위 명령어 실행하여 의도적인 disk full 상황을 만들어주도록 하자.

📌 여기서 잠깐

/dev/null : 비우는 역할
cat /dev/null > /var/log/nginx/access.log -> /var/log/nginx/access.log 파일의 내용은 비워지게 된다

/dev/zero : 비우는 역할
내용을 비우면서 무수히 많은 0으로 내용을 채우게 되고, 당연히 무한대로 파일 사이즈가 늘어나게 된다.
cat /dev/zero > /var/log/nginx/access.log


▪️ 장애 원인 찾기

image


▪️ 서버로드가 높은가?

: No

로드에버리지 확인

uptime

14:53  up  7:31, 3 users, load averages: 3.65 3.93 4.00

서버 부하 그리 높지 않음.


▪️ 메모리가 높은가?

: No

메모리 확인

free -m

              total        used        free      shared  buff/cache   available
Mem:           1974         124         496           0        1353        1677
Swap:             0           0           0

메모리 여유 공간 남아있음.


▪️ 디스크를 많이 쓰는가?

: Yes

디스크확인

df -h | grep "/$"

/dev/sda3        11G   11G  108K 100% /

디스크가 꽉 차있음!!


▪️ 한 줄 스크립트 작성

  • '/' 경로에서 용량 높은 파일 찾는 한 줄 스크립트 작성하기

--max-depth=1: 현재 위치에서 한 단계 아래의 디렉토리의 용량 총 합을 읽기 쉽게 출력

cd /; pwd; du -h --max-depth=1 2>/dev/null | grep "G"

2.1G	./usr
7.0G	./home
9.6G	. 
cd /; pwd; du -sh *  2>/dev/null | grep "G"

7.0G	home
2.1G	usr

Loading script...