서버 운영 시 생길 만한 오류와 처리·방지 방법

조회수 25

서버 운영 중 자주 발생하는 오류와 그에 대한 처리 방법, 그리고 사전 방지 방안을 정리한 내용이다. 디스크, 메모리, 프로세스, 네트워크, 로그 관련 항목을 중심으로 서술한다.

1. 디스크 풀 (Disk Full)

증상 — 쓰기 실패, DB 오류, 로그 미기록, "No space left on device" 메시지 발생.

원인 — 로그 파일, 업로드 파일, 캐시, DB 데이터 등이 누적되어 해당 파티션 사용률이 100%에 도달한 경우.

# 사용량 확인
df -h
du -sh /var/log/* | sort -hr | head -20

처리 — 큰 로그·캐시 정리 후 서비스 재시작. DB 로그·binlog 줄이거나 오래된 백업 삭제.

방지 — logrotate를 이용한 로그 자동 압축·삭제, 디스크 사용량 모니터링 및 알람 설정, 업로드·캐시 디렉터리 용량 한도 관리. 디스크 풀로 인한 장애 시 df·du로 원인 파악 후 로그 정리 및 logrotate 설정을 적용하면 재발을 방지할 수 있다.

2. 메모리 부족 (OOM)

증상 — 프로세스가 비정상 종료되며, dmesg에 "Out of memory" 또는 "Killed process" 메시지가 기록된다.

원인 — 물리 메모리와 스왑을 모두 소진하여 커널이 프로세스를 강제 종료한 경우.

# 메모리 사용량
free -h
# OOM 기록 확인
dmesg | grep -i "out of memory"

처리 — 불필요한 프로세스 종료, PHP-FPM·아파치 워커 수·DB 캐시 줄이기, 임시로 스왑 추가.

방지 — 워커 및 max_children 수를 서버 메모리 규모에 맞게 조정하고, 메모리 사용량 모니터링·알람을 설정하며, 애플리케이션의 메모리 누수 여부를 점검한다. PHP-FPM의 max_children을 과도하게 설정한 경우 OOM이 발생할 수 있으므로, 메모리 용량에 맞게 조정하면 방지할 수 있다.

3. 로그·캐시로 디스크 차는 것

증상 — 디스크 풀의 대표적 원인이다. /var/log 또는 캐시 디렉터리 용량이 급격히 증가한다.

처리 — 오래된 로그 삭제·압축, 애플리케이션 로그 레벨·로테이션 설정.

방지 — logrotate 설정으로 일별·주별 압축·보관 기간 제한.

# logrotate 예시 (설정만, 실제 경로는 환경에 맞게)
# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
    daily
    rotate 14
    compress
    missingok
    notifempty
}

4. 방화벽·포트 막힘

증상 — 외부 접속 불가, 타임아웃, "Connection refused" 또는 응답 없음.

원인 — 방화벽(firewalld, iptables, 보안 그룹)에서 해당 포트가 미개방되었거나, 서비스가 해당 포트를 리스닝하지 않는 경우.

# 리스닝 포트 확인
ss -tlnp
# firewalld에서 포트 열기
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload

방지 — 배포 및 설정 변경 시 방화벽·보안 그룹 규칙을 점검하고, 필요한 포트만 개방한다. 배포 후 접속 불가 시 보안 그룹·방화벽에 해당 포트가 등록되어 있는지 확인하고, 미등록 시 포트를 추가하여 해결할 수 있다.

5. 프로세스 다운·응답 없음

증상 — 웹·DB 응답 없음, systemctl status에서 failed 또는 inactive.

처리 — 로그 확인 후 재시작. 설정 오류면 수정 후 재시작.

systemctl status httpd php-fpm mysqld
journalctl -u httpd -n 50
sudo systemctl restart httpd

방지 — systemd에서 restart 정책, 헬스 체크·모니터링으로 다운 감지 후 알람·자동 재시작.

6. DB 연결 실패·슬로우 쿼리

증상 — "Too many connections", 타임아웃, 페이지가 매우 느려짐.

원인 — max_connections 초과, 슬로우 쿼리·락, 디스크 I/O 부족.

처리 — 불필요한 연결 종료, 슬로우 쿼리 로그로 원인 쿼리 찾아 인덱스·쿼리 개선, DB 재시작(최후).

방지 — 연결 풀 및 타임아웃 설정, 정기적인 슬로우 쿼리·인덱스 점검, DB 및 디스크 모니터링을 수행한다. "Too many connections" 발생 시 max_connections 조정과 함께 애플리케이션에서 연결을 해제하지 않는 부분을 수정하면 해결할 수 있다.

7. SELinux·권한 오류

증상 — 403, 파일 읽기·쓰기 실패, 로그에 "Permission denied" 또는 avc 메시지.

처리 — 필요한 경우 setsebool·chcon으로 SELinux 허용, 또는 테스트용 setenforce 0 후 원인 확인. 권한은 chmod·chown으로 조정.

방지 — 배포 경로, 권한, SELinux 컨텍스트를 배포 가이드에 명시하고, 동일 환경에서 정기적으로 점검한다.

flowchart TD A["오류 발생"] B["디스크"] C["메모리"] D["네트워크/방화벽"] E["프로세스/서비스"] F["DB/연결"] G["권한/SELinux"] A --> B A --> C A --> D A --> E A --> F A --> G B --> H["df/du·logrotate"] C --> I["free·워커 조정"] D --> J["ss·firewall"] E --> K["systemctl·journalctl"] F --> L["슬로우 쿼리·연결 수"] G --> M["setsebool·chmod"]

8. 정리

자주 발생하는 항목은 디스크 풀, 메모리 부족(OOM), 방화벽·포트, 프로세스 다운, DB 연결·슬로우 쿼리, 권한·SELinux이다. 처리 시 로그 및 명령어로 원인을 좁힌 뒤 해당 항목만 조정하며, 방지를 위해서는 모니터링, 알람, 자동화(logrotate, 워커 수, 방화벽 규칙 등)를 사전에 구성하는 것이 좋다.

한 줄 요약

디스크 풀 → df/du·logrotate·용량 모니터링. OOM → free·워커 수·메모리 알람. 방화벽 → ss·firewall·보안그룹 확인. 프로세스 다운 → systemctl·journalctl·재시작. DB → 연결 수·슬로우 쿼리·인덱스. 권한 → SELinux·chmod. 원인 확인 후 처리하고, 모니터링·자동화로 방지.

댓글 0

  • 첫 번째 댓글을 남겨보세요.