파일기술자(file descriptor) 한계 - Apache HTTP Server

Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > 가상호스트

# 파일기술자(file descriptor) 한계

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

가상호스트를 많이 사용하고 각 가상호스트에 서로 다른 로그파일을 지정하면, 아파치가 사용가능한 파일기술자(file descriptor, 흔히 파일핸들(file handle)이라고 부름)를 다 써버릴 수 있다. 아파치가 사용하는 파일기술자의 총 개수는 오류 로그파일당 한개, 다른 로그파일 지시어당 한개, 추가로 내부용도로 10-20개를 더한 수다. 유닉스 운영체제는 프로세스가 사용할 수 있는 파일기술자 개수를 제한한다. 이 한계는 보통 64개로, 보통 이보다 큰 hard-limit까지 늘릴 수 있다.

아파치는 이 한계를 필요한만큼 늘리려고 하지만, 실패하는 경우가 있다:

1. 시스템이 `setrlimit()` 시스템호출을 제공하지 않는다.
2. (Solaris 2.3과 같이) 시스템에서 `setrlimit(RLIMIT_NOFILE)` 함수가 동작하지 않는다.
3. 필요한 파일기술자 개수가 hard limit 보다 많다.
4. (Solaris 2) 시스템이 stdio 스트림을 256이하의 파일기술자만을 사용하도록 제한하는 등 파일기술자에 제약을 가한다.

이 경우 해결책은:

- 로그파일 개수를 줄인다. `<VirtualHost>` 섹션에서 로그파일을 지정하지 않고 주 로그파일을 사용한다. (더 자세한 방법은 아래 로그파일 나누기를 참고하라.)
- 사용하는 시스템이 (위의) 1번째나 2번째 경우에 해당한다면, 다음과 같은 스크립트로 아파치를 시작하기 전에 파일기술자 한계를 늘린다.

  ``#!/bin/sh
  ulimit -S -n 100
  exec httpd``

## 로그파일 나누기

여러 가상호스트가 같은 로그파일을 사용한다면 나중에 각 가상호스트의 통계분석을 위해 로그파일을 나누고 싶을 것이다. 이 작업은 다음과 같이 할 수 있다.

먼저 로그 항목에 가상호스트 정보를 추가한다. 이를 위해 `LogFormat` 지시어와 `%v` 변수를 사용한다. 이 변수를 로그 형식문자열 앞에 추가한다:

`LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost
CustomLog logs/multiple_vhost_log vhost`

그러면 common 로그형식 앞에 (`ServerName` 지시어에 나오는) 정규 가상호스트를 포함하여 로그파일을 기록한다. (로그파일 사용자정의에 관한 내용은 `사용자정의 로그형식`을 참고하라.)

로그파일을 (가상호스트당 한 파일씩) 나누고 싶다면 `split-logfile` 프로그램을 사용한다. 이 프로그램은 아파치 배포본의 `support` 디렉토리에 있다.

다음과 같이 프로그램을 실행한다:

`split-logfile < /logs/multiple_vhost_log`

가상호스트 로그파일을 가지고 이 프로그램을 실행하면 로그파일에 나오는 각 가상호스트당 파일을 하나씩 만든다. 각각의 파일명은 `hostname.log`이다.

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