서버 운영
서버 로그를 읽고 문제를 추적하기
서버 문제를 해결할 때는 로컬 개발 환경과 운영 환경의 차이를 염두에 두고 로그와 시스템 상태를 함께 봐야 한다.
서버 운영 중 문제가 발생했을 때, 웹 인터페이스만 보고 판단하기는 어렵다. 로그 파일, 시스템 리소스, 네트워크 설정을 함께 봐야 원인을 찾을 수 있다. 특히 혼자 운영하는 서버라면 더욱 그렇다.
가장 최근 로그부터 확인하기
문제가 발생한 시간 근처의 로그를 찾는다.
# systemd 저널에서 최근 100줄 확인
sudo journalctl -n 100
# 특정 서비스의 로그
sudo journalctl -u nginx -n 50
# 실시간 로그 보기
sudo journalctl -f
# 시간 범위로 검색
sudo journalctl --since "2024-01-15 10:00" --until "2024-01-15 11:00"
에러 메시지의 계층 읽기
로그에는 여러 계층의 에러가 있다. 가장 중요한 것부터 찾는다.
ERROR: Connection refused (이유)
ERROR: Cannot connect to database (결과)
ERROR: API call failed (외부 증상)
"Connection refused"가 실제 원인이고, 나머지는 그 결과다. 항상 근본 원인을 찾아야 한다.
디스크와 메모리 확인
많은 운영 문제는 리소스 부족에서 비롯된다.
# 디스크 사용률
df -h
# 디렉토리별 크기
du -sh /var/log/*
du -sh /home/*
# 메모리 상태
free -h
# 프로세스별 메모리
ps aux --sort=-%mem | head
만약 디스크가 90% 이상 찼다면, 오래된 로그나 임시 파일을 삭제해야 한다.
포트와 네트워크 확인
서비스가 올바른 포트에서 실행 중인지 확인한다.
# 열린 포트 확인
sudo ss -lntp
# 특정 포트 확인
sudo ss -lntp | grep 3000
# 연결 상태 확인
sudo ss -antp | grep ESTABLISHED | wc -l
파일 권한 확인
애플리케이션이 필요한 파일에 접근할 수 없으면 에러가 난다.
# 파일 소유자와 권한 확인
ls -la /var/www/app
# 소유자 변경
sudo chown -R app_user:app_group /var/www/app
# 권한 설정
sudo chmod 755 /var/www/app
로그 로테이션 확인
로그 파일이 너무 커지면 성능이 떨어진다. logrotate가 제대로 작동하는지 확인한다.
# logrotate 설정 확인
cat /etc/logrotate.d/nginx
# 수동 테스트
sudo logrotate -f /etc/logrotate.d/nginx
# 로테이션된 로그 확인
ls -la /var/log/nginx/ | grep -E 'error.*\.gz'
시간대 확인
UTC와 로컬 시간대 차이로 인해 로그의 시간이 엉망일 수 있다.
# 현재 시간과 타임존 확인
date
timedatectl
# 시간대 변경 (필요시)
sudo timedatectl set-timezone Asia/Seoul
지속적인 모니터링 설정
한 번 해결한 문제가 다시 나타나는 것을 방지하려면 모니터링을 설정한다.
# 특정 프로세스 모니터링
watch -n 5 'ps aux | grep your-app'
# 디스크 사용률 모니터링
watch -n 60 'df -h'
체크리스트
journalctl로 문제 시간대의 로그를 확인한다.- 에러 메시지의 근본 원인을 찾는다 (직접적인 원인이 아님).
- 디스크, 메모리, CPU 사용률을 확인한다.
- 서비스가 올바른 포트에서 실행 중인지 확인한다.
- 파일 권한과 소유자를 확인한다.
- 로그 로테이션이 제대로 작동하는지 확인한다.
- 시간대가 올바른지 확인한다.
서버 운영 문제는 부분적 정보로는 풀기 어렵다. 로그, 리소스, 설정을 모두 함께 보면서 인과관계를 파악해야 한다.