apache 2.4에서 달라진 기능 2가지

2016-11-08

apache 2.4버전을 사용하면서 이전버전과는 달라진 두가지 부분에 대해서 알게 되었다. 하나는 ErrorLog 에서 CustomLog format이 가능해졌다는 점과, AccessControl의 문법이 달라졌다는 것이다. Custom Error Log는 잘 쓰면 에러를 추적할 때 정말 유용하다.

최근 웹서버를 CentOS 7 기반으로 재설치하면서 apache 2.4 버전을 사용해 보았다. 2.2 버전과는 다른 부분중에 2가지 부분을 살펴보았는데 다음과 같다.

ErrorLog 에서 Custom Log Format 이 가능해졌다.

apache 2.4 에서는 Error Log 에 대해서 Format 설정이 가능하다. 사용 키워드는 ErrorLogFormat 이고 매뉴얼을 참고하자. link

이전까지는 access log 에 대해서만 LogFormat 이 가능했는데 2.4부터 error log 에 대해서도 formating 이 설정 가능해졌다. 대부분의 웹서비스에서 error log 는 서비스의 다양한 오류를 추적하고, 상태를 확인하데는 주요하게 사용되기 때문에 이를 활용하면 디버깅이 훨씬 수월해진다.

사용문법은 다음과 같고, 생각보다 어렵지 않다.

ErrorLogFormat “[%{u}t] [%m:%l] [host:%{Host}i , ip:%a] %7F: %E: %M ,\ referer\ %{Referer}i ,\ User-Agent\ %{User-Agent}i”

여기서 사용한 Format 키워드들은 다음과 같다.

Format 키워드 설명
%{u}t 시간을 기록한다 이때 micro-second 까지 포함한다. micro-second 가 필요없다면 %t 만 쓰면 된다.
%m 에러 로그를 기록하게된 apache 모듈의 이름을 기록한다. 기본적으로는 core가 기록되고, 에러를 기록하는 모듈명이(ex, authz_core )기록된다.
%l 로그 레벨이 기록된다.
%{Host}i 서버가 2개 이상의 virtual host 를 가지는 경우 이를 구분하기 위해서 추가했다. 정확하게는 ${name}i 의 형태인데 여기서 name은 Request header 의 name 이다.
%a client 의 IP 를 기록한다.
%F 문제가 발생한 소스 파일의 이름과 line number 를 기록한다.
%E 에러 status code 가 기록된다. 대부분 구글링하게 되는 핵심 키워드.
%M 실제 로그 메세지 내용이다.
%{Referer}i Request 의 Referer 를 기록하도록 했다.
%{User-Agent}i User-Agent 를 기록하도록 했다.

%{name}i 의 경우에는 apache conf에서 SetEnvIf 등으로 설정한 파라미터도 기록할 수 있기 때문에 유용하게 사용할 수 있다.

기타 보다 자세한 내용은 매뉴얼을 참고하면 된다.

Access Control 문법의 변경

기존의 apache 2.2 와 비교하여 access control 문법이 변경되었다. 물론 이전 2.2 버전까지 사용되던 문법을 완전히 사용하지 못하는 것은 아니고 mod_access_compat apache 모듈이 설치되어 있다면 사용가능하다. 다만 이경우 2.2 문법과 2.4 문법을 혼용하면, 원하는 대로 동작하지 않을 수 있기 때문에 이왕이면 한쪽으로 통일하는 것이 좋아보인다. 나의 경우에는 2.4 문법으로 통일했다.

// 2.2 의 문법
<Location /server-status>
        SetHandler server-status
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
</Location>

<FilesMatch "^\.ht">
        Order allow,deny
        Deny from all
        Satisfy All
</FilesMatch>
// 2.4의 문법
<Location /server-status>
        SetHandler server-status
        Require all denied
        Require ip 127.0.0.1
</Location>

<FilesMatch "^\.ht">
        Require all denied
        Satisfy All
</FilesMatch>

다음은 조금 더 복잡한 access control 이다.

// 2.2 문법

#bingbot 을 막아보았다.
BrowserMatch "bingbot" bingbot

#192.168.10.10 IP를 막아보았다.
SetEnvIfNoCase Remote_Addr 192.168.10.10 ddosIP

<Location />
        Order allow,deny
        Allow from all
        Deny from env=bingbot
        Deny from env=ddosIP
</Location>
// 2.4 문법

#bingbot 을 막아보았다.
BrowserMatch "bingbot" bingbot

#192.168.10.10 IP를 막아보았다.
SetEnvIfNoCase Remote_Addr 192.168.10.10 ddosIP

<Location />
        <RequireAny>
            <RequireAll>
                Require all granted
                Require not env bingbot
                Require not env ddosIP
            </RequireAll>
        </RequireAny>
</Location>

지금 당장은 apache 2.2 에서 사용하던 access control 문법을 바꾸지 않아도 되지만, 미래에는 없어질 것이기 때문에 시간이 난다면 고쳐주는 게 좋은것 같다.

보다 자세한 문법은 매뉴얼을 참고하자.


comments powered by Disqus