Apache HTTP Server Version 2.4

Apache > HTTP Server > Documentation > Version 2.4 > 모듈

# 아파치 모듈 mod_cgi

가능한 언어: en | fr | ja | ko

이 문서는 최신판 번역이 아닙니다. 최근에 변경된 내용은 영어 문서를 참고하세요.

설명: | CGI 스크립트 실행
상태: | Base
모듈명: | cgi_module
소스파일: | mod_cgi.c

### 요약

서버는 mime type이 `application/x-httpd-cgi`이거나 (아파치 1.1 이후) 핸들러가 `cgi-script`인 모든 파일을 CGI 스크립트로 인식하여, 실행하고, 그 결과를 클라이언트에게 보낸다. 파일이 `AddType` 지시어로 지정한 확장자를 가지거나, `ScriptAlias` 디렉토리 안에 있으면 CGI로 처리된다.

서버는 CGI 스크립트를 부를때 `DOCUMENT_ROOT`라는 환경변수를 추가한다. 이 변수는 `DocumentRoot` 설정값을 가진다.

아파치에서 CGI 스크립트를 사용하는 방법에 대한 소개는 CGI로 동적 페이지 생성 투토리얼을 참고하라.

유닉스에서 다중쓰레드 MPM을 사용한다면 이 모듈대신 `mod_cgid` 모듈을 사용해야 한다. 사용자 입장에서 이 두 모듈은 기본적으로 동일하다.

### 주제

- CGI 환경변수
- CGI 디버깅

### 지시어들

### Bugfix checklist

- httpd changelog
- Known issues
- Report a bug

### 참고

- `AcceptPathInfo`
- `Options`
- `ScriptAlias`
- `AddHandler`
- 다른 사용자 ID로 CGI 프로그램 실행하기
- CGI 표준
- Comments

## CGI 환경변수

서버는 다음과 같은 방법으로 CGI 표준이 설명하는 CGI 환경변수를 설정한다:

PATH_INFO
  이 변수는 `AcceptPathInfo` 지시어를 직접 `off`로 지정한 경우에만 설정한다. `AcceptPathInfo`가 없는 경우 서버는 기본적으로 경로 정보가 있는 요청에 대해 404 NOT FOUND 오류를 내지만, `mod_cgi`는 경로 정보를 (URI에서 스크립트 파일명 뒤에 나오는 `/more/path/info`) 받는다. `AcceptPathInfo` 지시어를 생략하면 `mod_cgi` 요청에 대해서 `AcceptPathInfo`를 `On`으로 설정한 것과 같다.
REMOTE_HOST
  이 변수는 `HostnameLookups`가 `on`이고 (기본값은 off), 접속한 호스트 주소를 역DNS 검색하여 실제 호스트명을 찾은 경우에만 설정한다.
REMOTE_IDENT
  이 변수는 `IdentityCheck`가 `on`이고, 접속한 호스트가 ident 프로토콜을 지원하는 경우에만 설정한다. 쉽게 이 값을 속일 수 있기때문에 이 변수의 내용을 믿으면 안되고, 클라이언트와 서버 사이에 프록시가 있다면 변수 내용이 완전히 무의미함을 주의하라.
REMOTE_USER
  CGI 스크립트가 인증을 거쳐야하는 경우에만 설정한다.

## CGI 디버깅

어디에서 잘못 실행되는지 스크립트의 출력을 (표준출력과 표준오류) 볼 수 없기때문에 CGI 스크립트는 전통적으로 디버깅하기 어려웠다. 아파치 1.2 이후에 추가된 지시어를 사용하면 발생한 오류를 자세히 로그에 남길 수 있다.

### CGI 로그파일 형식

CGI 오류로그는 정상적으로 실행하지 못한 CGI를 기록한다. 오류가 발생한 CGI 스크립트는 로그에 여러 줄의 정보를 남긴다. 첫번째 두 줄은 항상 아래와 같은 형식이다:

`%% [시간] 요청줄
%% HTTP-상태 CGI-스크립트-파일명`

CGI 스크립트를 실행할 수 없는 오류인 경우 로그파일에 추가로 두 줄을 더 기록한다:

`%%error
오류문`

스크립트가 (보통 스크립트의 버그때문에) 잘못된 헤더 정보를 반환하는 경우, 다음 내용을 로그에 기록한다:

`%request
받은 모든 HTTP 헤더
(있다면) POST나 PUT 내용
%response
CGI 스크립트 출력의 모든 헤더
%stdout
CGI 표준출력
%stderr
CGI 표준오류
`

(스크립트가 표준출력이나 표준오류에 아무 내용도 출력하지 않았다면 %stdout과 %stderr 부분은 생략될 수 있다).

## CGIScriptTimeout 지시어

설명: | The length of time to wait for more output from the CGI program
문법: | `CGIScriptTimeout time[s|ms]`
기본값: | `value of `Timeout` directive when unset`
사용장소: | 주서버설정, 가상호스트, directory, .htaccess
상태: | Base
모듈: | mod_cgi
지원: | Available in version 2.4.59 and later.

The documentation for this directive has not been translated yet. Please have a look at the English version.

## ScriptLog 지시어

설명: | CGI 스크립트 오류로그파일의 위치
문법: | `ScriptLog file-path`
사용장소: | 주서버설정, 가상호스트
상태: | Base
모듈: | `mod_cgi`, `mod_cgid`

`ScriptLog` 지시어는 CGI 스크립트 오류로그파일을 지정한다. `ScriptLog`를 사용하지않으면 오류로그를 만들지 않는다. 사용하면 아규먼트로 지정한 파일에 CGI 오류를 기록한다. 상대경로를 지정하면 `ServerRoot`에 상대경로로 받아들인다.

### 예제

`ScriptLog logs/cgi_log`

자식 프로세스를 실행하는 사용자, 즉 `User` 지시어로 지정한 사용자 권한으로 로그를 연다. 그래서 그 사용자가 스크립트 로그가 있는 디렉토리에 쓰기권한이 있던지, 직접 미리 파일을 만들어서 그 사용자에게 쓰기권한을 줘야 한다. 스크립트 로그를 주 로그 디렉토리에 둔다면 자식 프로세스를 실행하는 사용자에게 쓰기권한을 주기위해 디렉토리 권한을 변경하지 마라.

스크립트 로그는 CGI 스크립트를 작성할때 디버깅을 위한 용도이지 서버를 실행하는 동안 계속 사용하기위함이 아님을 주의하라. 속도와 효율성면에서 최적화가 안되있고, 설계한 목적이외의 방법으로 사용하면 보안상 문제가 될 수 있다.

## ScriptLogBuffer 지시어

설명: | 스크립트 로그에 기록할 PUT 혹은 POST 요청의 최대량
문법: | `ScriptLogBuffer bytes`
기본값: | `ScriptLogBuffer 1024`
사용장소: | 주서버설정, 가상호스트
상태: | Base
모듈: | `mod_cgi`, `mod_cgid`

큰 내용을 받아서 로그파일이 너무 빨리 커지는 현상을 막기위해 파일에 기록할 PUT 혹은 POST 내용의 크기를 제한한다. 기본적으로 1024 바이트까지 로그에 기록하지만, 이 지시어를 사용하여 수정할 수 있다.

## ScriptLogLength 지시어

설명: | CGI 스크립트 로그파일의 크기 제한
문법: | `ScriptLogLength bytes`
기본값: | `ScriptLogLength 10385760`
사용장소: | 주서버설정, 가상호스트
상태: | Base
모듈: | `mod_cgi`, `mod_cgid`

`ScriptLogLength`는 CGI 스크립트 로그파일의 크기를 제한한다. CGI 오류가 발생할때마다 (모든 요청 헤더, 모든 스크립트 출력 등) 많은 정보가 로그에 기록되기때문에 파일이 매우 커질 수 있다. 파일이 무한히 커지는 문제를 막기위해 이 지시어를 사용하여 CGI 로그파일의 최대 파일크기를 설정한다. 파일의 크기가 설정한 값을 넘으면 더 이상 정보를 기록하지않는다.

가능한 언어: en | fr | ja | ko

## Comments

Notice:
This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.