[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] "
참고 자료
- Apache 공식 문서: 'Apache Log Files' 바로가기
- HTTP 상태 코드 상세: 'MDN HTTP Status' 바로가기
- 자료 출처: 'bignosebird.com' 바로가기