본문으로 건너뛰기

[L] 아파치 서버 status & error 코드 목록

💡 요약 정리

  • 아파치 access_log에서 HTTP 상태 코드를 통해 요청 처리 결과를 확인할 수 있습니다
  • 1xx는 정보 응답, 2xx는 성공, 3xx는 리다이렉션, 4xx는 클라이언트 오류, 5xx는 서버 오류를 의미합니다
  • 가장 일반적인 코드: 200(성공), 301/302(리다이렉트), 404(찾을 수 없음), 500(서버 오류)

아파치의 access_log를 확인하여 status 및 error 코드를 보고 Request 상태를 확인할 수 있습니다.

이 가이드에서는 HTTP 상태 코드의 종류와 의미를 설명합니다.

설치 환경:

  • CentOS 5.x (64bit)
  • Apache 2.2.23

1. access_log에서 status 코드 확인

access_log 파일에서 HTTP 상태 코드를 확인할 수 있습니다.

[root@cafe24 logs]# vi dummy-host.example.com-access_log.1
-----------------------------------------------------------------------------------------------------------------
x.x.x.x - - [26/Feb/2013:10:38:50 +0900] "GET /server-status HTTP/1.1" 403 215
x.x.x.x - - [26/Feb/2013:10:38:50 +0900] "GET /favicon.ico HTTP/1.1" 404 209
x.x.x.x - - [26/Feb/2013:10:39:36 +0900] "GET /server-status HTTP/1.1" 200 4716
x.x.x.x - - [26/Feb/2013:10:39:36 +0900] "GET /favicon.ico HTTP/1.1" 404 209
x.x.x.x - - [26/Feb/2013:10:43:43 +0900] "GET /server-status HTTP/1.1" 200 4961
x.x.x.x - - [26/Feb/2013:10:43:43 +0900] "GET /favicon.ico HTTP/1.1" 404 209
x.x.x.x - - [26/Feb/2013:10:43:44 +0900] "GET /server-status HTTP/1.1" 200 4961
x.x.x.x - - [26/Feb/2013:10:43:44 +0900] "GET /favicon.ico HTTP/1.1" 404 209
x.x.x.x - - [26/Feb/2013:21:27:58 +0900] "HEAD / HTTP/1.0" 200 -

위 로그에서 403, 404, 200 등으로 표시된 값들이 status 코드입니다.

각 줄의 형식:

  • IP 주소
  • 날짜 및 시간
  • HTTP 메서드 및 요청 URI
  • HTTP 상태 코드
  • 응답 크기 (bytes)

2. HTTP Status 코드 목록

① Informational 1xx (정보 응답)

클라이언트의 요청을 받았으며, 계속 진행 중임을 나타냅니다.

  • 100 = Continue
    • 요청의 첫 번째 부분을 받았으며, 클라이언트는 계속 진행해야 함
  • 101 = Switching Protocols
    • 서버가 프로토콜을 전환함

② Successful 2xx (성공 응답)

클라이언트의 요청이 성공적으로 처리되었음을 나타냅니다.

  • 200 = OK
    • 요청이 성공적으로 처리됨 (가장 일반적인 성공 응답)
  • 201 = Created
    • 요청이 성공적으로 처리되어 새로운 리소스가 생성됨
  • 202 = Accepted
    • 요청이 접수되었지만 아직 처리되지 않음
  • 203 = Non-Authoritative Information
    • 요청이 성공했으나 반환된 정보가 원래 서버가 아닌 복사본에서 온 것임
  • 204 = No Content
    • 요청이 성공했으나 반환할 콘텐츠가 없음
  • 205 = Reset Content
    • 요청이 성공했으며 클라이언트는 문서 뷰를 리셋해야 함
  • 206 = Partial Content
    • 부분적인 GET 요청이 성공함 (Range 헤더 사용 시)

③ Redirection 3xx (리다이렉션)

추가 조치가 필요함을 나타냅니다.

  • 300 = Multiple Choices
    • 요청에 대해 여러 선택이 가능함
  • 301 = Moved Permanently
    • 요청한 리소스가 영구적으로 새 URL로 이동함
    • SEO에서 중요: 검색 엔진이 새 URL을 인덱싱함
  • 302 = Found
    • 요청한 리소스가 일시적으로 다른 URL에 있음
  • 303 = See Other
    • 요청에 대한 응답이 다른 URL에서 GET으로 얻을 수 있음
  • 304 = Not Modified
    • 클라이언트가 캐시한 버전과 동일하여 수정되지 않음
  • 305 = Use Proxy
    • 요청한 리소스는 프록시를 통해서만 접근 가능함
  • 306 = (Unused)
    • 더 이상 사용되지 않음
  • 307 = Temporary Redirect
    • 요청한 리소스가 일시적으로 다른 URL에 있음 (302와 유사하나 HTTP 메서드 유지)

④ Client Error 4xx (클라이언트 오류)

클라이언트의 요청에 오류가 있음을 나타냅니다.

  • 400 = Bad Request
    • 잘못된 요청 구문, 유효하지 않은 요청 메시지
  • 401 = Unauthorized
    • 인증이 필요함 (로그인 필요)
  • 402 = Payment Required
    • 향후 사용을 위해 예약됨
  • 403 = Forbidden
    • 서버가 요청을 거부함 (권한 없음)
  • 404 = Not Found
    • 요청한 리소스를 찾을 수 없음 (가장 일반적인 오류)
  • 405 = Method Not Allowed
    • 요청한 HTTP 메서드가 허용되지 않음
  • 406 = Not Acceptable
    • 요청한 리소스가 Accept 헤더 조건을 만족할 수 없음
  • 407 = Proxy Authentication Required
    • 프록시 인증이 필요함
  • 408 = Request Timeout
    • 서버가 요청을 기다리다 타임아웃됨
  • 409 = Conflict
    • 요청이 현재 서버 상태와 충돌함
  • 410 = Gone
    • 요청한 리소스가 영구적으로 사라짐 (404와 유사하나 영구적)
  • 411 = Length Required
    • Content-Length 헤더가 필요함
  • 412 = Precondition Failed
    • 전제 조건이 실패함
  • 413 = Request Entity Too Large
    • 요청 본문이 너무 큼
  • 414 = Request-URI Too Long
    • 요청 URI가 너무 김
  • 415 = Unsupported Media Type
    • 지원하지 않는 미디어 타입
  • 416 = Requested Range Not Satisfiable
    • Range 헤더 필드가 잘못됨
  • 417 = Expectation Failed
    • Expect 헤더 필드의 기대가 충족되지 않음

⑤ Server Error 5xx (서버 오류)

서버가 유효한 요청을 처리하지 못했음을 나타냅니다.

  • 500 = Internal Server Error
    • 서버 내부 오류 (가장 일반적인 서버 오류)
    • 원인: PHP 구문 오류, 권한 문제, 서버 설정 오류 등
  • 501 = Not Implemented
    • 서버가 요청 메서드를 지원하지 않음
  • 502 = Bad Gateway
    • 게이트웨이나 프록시 역할을 하는 서버가 업스트림 서버로부터 잘못된 응답을 받음
  • 503 = Service Unavailable
    • 서비스 이용 불가 (일시적, 유지보수 또는 과부하로 인해)
  • 504 = Gateway Timeout
    • 게이트웨이나 프록시가 업스트림 서버로부터 시간 내에 응답을 받지 못함
  • 505 = HTTP Version Not Supported
    • 서버가 요청에 사용된 HTTP 버전을 지원하지 않음

3. 일반적인 상태 코드 문제 해결

① 403 Forbidden

원인:

  • 디렉토리 권한 문제
  • .htaccess 설정 문제
  • Apache 설정에서 접근 거부

해결 방법:

  • 파일/디렉토리 권한 확인 (chmod 755)
  • Apache 설정에서 Allow from all 확인
  • .htaccess 파일 확인

② 404 Not Found

원인:

  • 파일이 존재하지 않음
  • URL 경로 오류
  • Rewrite 규칙 문제

해결 방법:

  • 파일 경로 확인
  • DocumentRoot 설정 확인
  • Rewrite 규칙 점검

③ 500 Internal Server Error

원인:

  • PHP 구문 오류
  • .htaccess 설정 오류
  • 서버 리소스 부족
  • 권한 문제

해결 방법:

  • Apache error_log 확인
  • PHP error_log 확인
  • .htaccess 문법 확인
  • 서버 리소스 확인

④ 503 Service Unavailable

원인:

  • 서버 과부하
  • 유지보수 모드
  • 백엔드 서버 다운

해결 방법:

  • 서버 부하 확인 (top, htop)
  • Apache 프로세스 확인
  • 백엔드 서비스 상태 확인

4. access_log 분석 팁

① 특정 상태 코드 필터링

# 404 오류만 확인
grep " 404 " access_log

# 5xx 서버 오류만 확인
grep " 5[0-9][0-9] " access_log

# 2xx 성공 응답만 확인
grep " 2[0-9][0-9] " access_log

② 상태 코드별 통계

# 상태 코드별 발생 횟수
awk '{print $9}' access_log | sort | uniq -c | sort -rn

# 가장 많이 발생한 오류 확인
awk '{if ($9 >= 400) print $9}' access_log | sort | uniq -c | sort -rn

③ 특정 IP의 요청 확인

# 특정 IP의 모든 요청
grep "^IP주소" access_log

# 특정 IP의 오류 요청만
grep "^IP주소" access_log | grep " [45][0-9][0-9] "

참고 자료