apache 2.2->2.4 설정 변경 사항 참고
https://findstar.pe.kr/2016/11/08/apache_2_4_custom_error_log_access_constrol/
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 문법을 바꾸지 않아도 되지만, 미래에는 없어질 것이기 때문에 시간이 난다면 고쳐주는 게 좋은것 같다.
보다 자세한 문법은 매뉴얼을 참고하자.