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

Apache Server 2.0

Apache HTTP Server Version 2.0

<-

파일기술자(file descriptor) 한계

가상호스트를 많이 사용하고 각 가상호스트에 서로 다른 로그파일을 지정하면, 아파치가 사용가능한 파일기술자(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

파일기술자 문제와 각 운영체제에서의 해결방법에 대한 자세한 내용은 파일기술자와 아파치 문서를 참고하라.

top

로그파일 나누기

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

먼저 로그 항목에 가상호스트 정보를 추가한다. 이를 위해 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이다.