본문 바로가기
카테고리 없음

서버 장애 발생 시 원인 분석과 대응 방법

by 백수A 2025. 3. 29. 20:51

서버 장애 발생 시 원인 분석과 대응 방법

1. 문제 상황: 예기치 않은 서버 다운

운영 중인 서비스에서 갑자기 서버가 응답하지 않는 상황이 발생했다. 클라이언트는 요청을 보냈지만 응답이 없고, 로그인을 하거나 데이터를 조회하는 기능이 작동하지 않는다.

이러한 장애 상황에서는 빠르게 원인을 파악하고 조치를 취해야 한다. 그러나 서버 장애는 단순한 네트워크 문제부터 심각한 하드웨어 결함까지 다양한 원인에 의해 발생할 수 있다.

대표적인 서버 장애 유형은 다음과 같다.

  • CPU 사용률이 급격히 상승하여 응답이 느려지는 경우
  • 메모리 부족으로 인해 프로세스가 강제 종료되는 경우
  • 디스크 용량이 부족하여 로그 기록이 중단되는 경우
  • 데이터베이스 연결 문제로 인해 요청이 실패하는 경우
  • 네트워크 장애로 인해 외부에서 접근이 불가능한 경우

2. 해결 과정: 서버 장애 진단 및 복구

2.1 서버 상태 점검

서버 장애가 발생하면 가장 먼저 서버의 현재 상태를 점검해야 한다.

CPU, 메모리, 디스크 사용량 확인

top  # 실시간 CPU 및 메모리 사용량 확인
df -h  # 디스크 사용량 확인
free -m  # 사용 가능한 메모리 확인

만약 CPU 사용률이 100%에 가까우면 특정 프로세스가 과부하를 일으키고 있을 가능성이 높다. 이 경우, top 또는 htop을 활용하여 어떤 프로세스가 자원을 많이 사용하는지 확인해야 한다.

ps aux --sort=-%cpu | head -10  # CPU 사용량이 높은 프로세스 확인
ps aux --sort=-%mem | head -10  # 메모리 사용량이 높은 프로세스 확인

네트워크 연결 상태 확인

ping google.com  # 인터넷 연결 확인
netstat -tulnp  # 현재 열려 있는 포트 확인

만약 특정 포트(예: 80, 443, 3306 등)가 열려 있지 않다면 방화벽 설정이나 서비스 실행 여부를 확인해야 한다.

systemctl status nginx  # 웹 서버 상태 확인
systemctl status mysql  # 데이터베이스 서버 상태 확인

2.2 로그 분석을 통한 원인 파악

서버가 정상적으로 실행 중이라면 로그를 확인하여 장애 원인을 분석해야 한다.

  • 웹 서버(Nginx, Apache) 로그: /var/log/nginx/access.log, /var/log/nginx/error.log
  • 애플리케이션 로그: /var/log/app.log (애플리케이션에 따라 다름)
  • 시스템 로그: /var/log/syslog 또는 /var/log/messages
  • 데이터베이스 로그: /var/log/mysql/error.log

예를 들어, Nginx 에러 로그에서 특정 오류가 발생하는지 확인하려면 다음 명령어를 사용할 수 있다.

tail -100 /var/log/nginx/error.log

또한, 시스템 전반적인 오류를 확인하려면 journalctl 명령어를 사용할 수 있다.

journalctl -xe  # 최근 시스템 로그 확인

2.3 서비스 재시작 및 일시적 복구

원인을 파악한 후 가장 빠르게 대응할 수 있는 방법은 관련 서비스를 재시작하는 것이다.

systemctl restart nginx  # 웹 서버 재시작
systemctl restart mysql  # 데이터베이스 서버 재시작

그러나 근본적인 원인을 해결하지 않으면 같은 문제가 반복될 수 있으므로, 로그 분석을 통해 재발 방지 대책을 마련해야 한다.

2.4 디스크 용량 부족 해결

서버 장애의 흔한 원인 중 하나는 디스크 용량 부족이다. 이 경우 불필요한 파일을 정리하고 로그 파일을 압축해야 한다.

du -sh /*  # 루트 디렉토리의 용량 확인
du -sh /var/log/*  # 로그 파일 크기 확인
rm -rf /var/log/*.gz  # 오래된 로그 파일 삭제

또한, 로그 파일이 너무 빨리 쌓이는 경우 로그 로테이션을 설정하여 자동으로 관리할 수 있다.

logrotate -f /etc/logrotate.conf

2.5 데이터베이스 연결 문제 해결

애플리케이션이 데이터베이스와 연결되지 않는다면 다음을 확인해야 한다.

  • 데이터베이스가 실행 중인지 확인: systemctl status mysql
  • 포트가 열려 있는지 확인: netstat -tulnp | grep 3306
  • DB 접속이 가능한지 테스트: mysql -u root -p

만약 연결이 차단되어 있다면 방화벽 설정을 확인해야 한다.

ufw allow 3306/tcp  # MySQL 포트 허용

2.6 트래픽 급증 대응

트래픽이 급증하여 서버가 버티지 못하는 경우, 부하를 분산할 수 있는 방법을 고려해야 한다.

  • 로드 밸런서를 활용하여 여러 서버로 트래픽 분산
  • CDN(Content Delivery Network) 적용하여 정적 콘텐츠 분산
  • 캐싱 도입 (Redis, Memcached)하여 데이터베이스 부하 줄이기

예를 들어, Nginx에서 캐싱을 설정하면 트래픽을 효과적으로 줄일 수 있다.

location / {
    proxy_cache cache_zone;
    proxy_cache_valid 200 10m;
    proxy_pass http://backend;
}

3. 최종 정리

서버 장애는 예기치 않게 발생할 수 있으며, 신속한 대응이 중요하다. 이번 글에서는 서버 장애 발생 시 점검해야 할 주요 사항과 해결 방법을 정리했다.

핵심 요약:

  • CPU, 메모리, 디스크 상태를 먼저 점검하여 문제를 파악한다.
  • 네트워크 상태를 확인하고 필요한 포트가 열려 있는지 검사한다.
  • 서버 로그를 분석하여 장애 원인을 찾아낸다.
  • 필요한 경우 웹 서버, 데이터베이스 서버를 재시작하여 일시적으로 복구한다.
  • 디스크 용량 부족 시 불필요한 파일을 정리하고 로그 관리를 설정한다.
  • 데이터베이스 연결 문제는 포트 설정과 방화벽을 점검하여 해결한다.
  • 트래픽 급증이 원인이라면 로드 밸런서와 캐싱을 활용하여 부하를 줄인다.

서버 장애를 최소화하려면 사전 예방 조치도 중요하다. 모니터링 시스템을 구축하고 장애 발생 시 자동으로 알림을 받을 수 있도록 설정하는 것이 좋다.