Apache Proxy Load Balancer 구성
Apache 웹 서버는 세계적으로 많이 사용되는 웹 서버이다. 많은 기능을 내장하고 있는데, 그 중에서 Proxy Load Balancer 구성에 대해서 설치부터 설정까지 기술 한다.
기술 환경은 다음과 같다.
- 배포판: Ubuntu14.04 64bit
- Apache: 2.4.25
- 컴파일 설치.
운영환경도 아주 중요하다. 이 문서에서 기술한 운영 환경은 AWS 환경이며 External ELB 바로 뒤에 Apache 웹 서버가 있다. 이 Apache 웹 서버는 뒤에 WAS 서버가 존재하는 환경이다.
의존성 패키지 설치
컴파일 설치를 하기전에 의존성 패키지를 다음과 같이 설치해 줍니다.
1 2 3 4 5 |
apt install libpcre3-dev apt install zlib1g-dev # mod_deflate 를 위해서 필요. apt install libevent-openssl-2.0-5 apt install libssl-dev apt install libtool autotools-dev |
설치
설치는 소스를 받아 직접 컴파일을 했다. 소스는 현재 최신버전인 2.4.25 버전으로 다운받아 압축 해제한다.
1 2 3 |
wget http://mirror.apache-kr.org//httpd/httpd-2.4.25.tar.bz2 tar xvzf httpd-2.4.25.tar.bz2 cd httpd-2.4.25 |
Apache 웹 서버의 확장 모듈을 설치하거나 별도의 유틸리티를 사용하기 위해서 apr, apr-utils 도 함께 설치해주어야 한다. 이 기능을 사용하기 위해서는 컴파일 시에 ‘–with-included-apr’ 옵션을 주어야 한다.
1 2 3 4 5 |
cd srclib wget http://mirror.apache-kr.org//apr/apr-1.5.2.tar.bz2 wget http://mirror.apache-kr.org//apr/apr-util-1.5.4.tar.bz2 tar xvjf apr-1.5.2.tar.bz2; mv apr-1.5.2 apr tar xvjf apr-util-1.5.4.tar.bz2; mv apr-util-1.5.4 apr-util |
이제 다음과 같이 Configure 해줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
./configure \ --prefix=/opt/httpd-2.4.25 \ --with-z \ --with-pcre \ --enable-http \ --enable-mpms-shared=all \ --enable-mods-static='vhost_alias log_config logio mime mime_magic alias headers status http negotiation' \ --enable-mods-shared='file_cache disk_cache deflate expires usertrack unique_id actions userdir autoindex cache mem_cache distcache auth_digest rewrite remoteip event prefork worker' \ --enable-ssl \ --with-ssl \ --with-openssl \ --enable-allowmethods \ --enable-session \ --enable-session-cookie \ --enable-session-crypto \ --with-crypto \ --enable-session-dbd=no \ --enable-log-debug \ --enable-log-forensic \ --enable-logio \ --disable-imagemap \ --disable-include \ --disable-charset-lite \ --disable-cgid \ --disable-asis \ --enable-ldap=no \ --enable-authnz-ldap=no \ --enable-cgid=no \ --enable-dav=no \ --enable-dav-fs=no \ --enable-isapi=no \ --enable-logio \ --enable-proxy \ --enable-proxy-connect \ --enable-proxy-ftp=no \ --enable-proxy-http \ --enable-proxy-fcgi=no \ --enable-proxy-scgi=no \ --enable-proxy-fdpass=no \ --enable-proxy-ajp \ --enable-proxy-balancer \ --enable-proxy-express \ --enable-proxy-hcheck \ --enable-ext-filter=no \ --enable-authnz-ldap=no \ --enable-lbmethod-byrequests \ --enable-lbmethod-bytraffic \ --enable-lbmethod-bybusyness \ --enable-lbmethod-heartbeat=no \ --enable-dav-lock=no\ --enable-so \ --with-included-apr |
아무런 오류 없이 끝나면 다음과 같이 컴파일, 설치 해줍니다.
1 2 |
make make install |
설치 디렉토리로 이동해서 다음과 같이 심볼릭 링크를 생성해 줍니다.
1 |
ln -s httpd-2.4.25 httpd |
httpd.conf 설정
Apache 웹 서버의 주요 설정은 httpd.conf 파일에서 이루어 집니다. 웹 서버이름, 실행할 데몬 소유자, 로깅, 사용할 모듈, 사용할 기능파일등에 대해서 설정할 수 있습니다.
사용할 모듈 설정
컴파일 설치를 했어도 사용할 모듈들을 최소화할 수 있습니다. 다음과 같이 해줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
LoadModule authn_core_module modules/mod_authn_core.so LoadModule authz_core_module modules/mod_authz_core.so LoadModule access_compat_module modules/mod_access_compat.so LoadModule allowmethods_module modules/mod_allowmethods.so LoadModule watchdog_module modules/mod_watchdog.so LoadModule reqtimeout_module modules/mod_reqtimeout.so LoadModule request_module modules/mod_request.so LoadModule filter_module modules/mod_filter.so LoadModule env_module modules/mod_env.so LoadModule setenvif_module modules/mod_setenvif.so LoadModule remoteip_module modules/mod_remoteip.so LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so LoadModule session_module modules/mod_session.so LoadModule session_cookie_module modules/mod_session_cookie.so LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so LoadModule unixd_module modules/mod_unixd.so |
어떤 기능을 사용할 것인지에 따라서 위 설정은 달라지지만, 적어도 Proxy Load Balancer 를 운영하기 위해 필요한 것과 불필요한 것만 위에서 기술 했다.
현재 활성화된 모듈이 무엇인지는 다음의 명령어로 확인 가능하다.
1 |
/opt/httpd/bin/httpd -M |
데몬 사용자/그룹 지정
Apache 웹 서버는 실행 프로세스와 HTTP 를 처리하는 데몬의 사용자/그룹를 다르게 지정할 수 있다. mod_unixd 에서 제공하는 것으로 다음과 같이 지정할 수 있다.
1 2 3 4 5 |
<IfModule unixd_module> User daemon Group daemon </IfModule> |
RemoteIp 사용 설정
Apache 웹 서버 앞에 AWS ELB 가 있다. AWS 의 ELB 는 Client IP 를 ‘X-Forwarded-IP’ 헤더에 담아 뒤로 넘겨준다. 하지만 Apache 웹 서버는 이것이 Client IP 인지를 인식하지 못하는데, ‘X-Forwarded-IP’ 헤더 필드 값이 실제 IP 로 사용하도록 지정할 수 있는데 mod_remoteip 가 이를 담당 한다. 다음과 같이 설정해 준다.
1 2 3 4 |
<IfModule remoteip_module> RemoteIPHeader X-Forwarded-For RemoteIPProxiesHeader X-Forwarded-By </IfModule> |
이렇게 설정을 해주면 이제부터 Apache 내부에서 사용하던 Client IP 관련 환경변수들이 ‘X-Forwarded-For’ 값으로 대체(override)된다. 바꿔말해서 Client IP 관련 환경 변수들을 하나하나 찾아서 ‘X-Forwarded-For’ 값으로 대체하지 않아도 된다.
log 설정
mod_remoteip 를 사용할 경우에 Apache 웹 서버의 로그에 Client IP 가 기록되도록 다음과 같이 추가해 준다.
1 |
LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" proxy_combined |
기준의 combined 로그 포맷을 이용해 ‘%h’ -> ‘%a’, ‘%b’->’%O’ 로 교체해주고 ‘proxy_combined’ 이름의 로그 포맷을 정의했다.
추가 설정
Apache 웹 서버는 기능별로 설정들을 따로 모아서 conf/extra 디렉토리에 모아 뒀다. 필요한 기능과 설정을 하고 싶다면 이 파일들을 수정하고 httpd.conf 파일에서 Include 명령어로 포함시켜주면 동작한다.
주요하게 포함되어지는 파일들은 다음과 같다.
1 2 3 4 |
Include conf/extra/httpd-mpm.conf Include conf/extra/httpd-languages.conf Include conf/extra/httpd-vhosts.conf Include conf/extra/httpd-default.conf |
httpd-mpm.conf
Apache 웹 서버의 프로세스 모델을 설정하는 파일이다. Apache 2.4 에서는 주요하게 세가지를 제공 한다.
- event (2.4 기본)
- profork
- worker
event 프로세스 모델은 ‘mpm_event_module’ 을 이용해서 설정 가능하며 httpd-mpm.conf 파일 중간쯤에 있다.
모델별로 동작 방법은 다르지만 설정하는 내용은 비슷하다. 대부분이 초기 프로세스 개수, 최소, 최대 쓰레드(Thread) 개수, 한 쓰레드당 최대 worker 등을 지정하는 식이다.
이 값은 얼마만큼 Apache 웹 서버가 일하는지에 따라서 달리 설정되어 진다. 이 값은 서비스 오픈전 부하 테스트를 거쳐서 확정된다.
httpd-default.conf
이 설정은 매우 중요하다. 특히나 AWS ELB 뒤에 Apache 웹 서버를 운영중이라면 아주 중요하다.
여기에서 reqtimeout_module 부분을 수정하지 않으면 아마도 로그에 ‘ELB-HealthChecker/1.0’ 요청에 대해서 408 을 리턴하는 것을 볼 수 있다.
1 2 |
10.204.211.223 - - [01/Nov/2011:14:42:22 +0000] "GET /health HTTP/1.1" 200 351 "-" "ELB-HealthChecker/1.0" 10.204.211.223 - - [01/Nov/2011:14:42:43 +0000] "-" 408 0 "-" "-" |
이는 httpd-default.conf 파일에서 다음을 수정해줘야 한다.
1 2 3 4 |
<IfModule reqtimeout_module> - RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500 + RequestReadTimeout header=65 body=65 </IfModule> |
이렇게 해야 하는 이유는 AWS ELB 의 Health Checker 가 Apache 웹 서버의 Alive 를 알아내기 위해서 패킷을 보내는데, AWS ELB 의 기본 Idle 값(60)보다 크게 잡아야 하기 때문이다.
위와같이 설정하면 408 오류는 보이지 않게 된다.
httpd-vhosts.conf
Proxy Load Balancer 설정
Proxy Load Balancer 설정을 위해서는 Proxy 설정을 먼저 알아야 한다. Apache 웹 서버의 Proxy 설정은 다음과 같다.
1 2 3 4 5 |
ProxyPass "/balancer-manager" ! ProxyPassReverse "/balancer-manager" ! ProxyPass "/adm/" "balancer://admincluster/adm/" ProxyPassReverse "/adm/" "balancer://admincluster/adm/" |
Proxy 는 ReverseProxy 로 동작하게 하면서 Load Balancer 를 지정하고 있다. URL 이 /adm 으로 들어올 경우에 위 설정을 따르게 되고 Load Balancer 로 연결이 된다.
1 2 3 4 5 6 7 8 9 10 |
<Proxy "balancer://admincluster"> # Server 1 BalancerMember "http://192.168.96.34:8280" route=192.168.96.34:8280 loadfactor=1 retry=10 timeout=60 # Server 2 BalancerMember "http://192.168.96.19:8380" route=192.168.96.19:8380 loadfactor=1 retry=10 timeout=60 ProxySet lbmethod=bybusyness </Proxy> |
Load Balancer 설정에서는 Balancer 를 위한 서버의 Member 를 등록한다. route 는 Sticky Session 부분과 관련이 있으며 Tomcat의 jvmRoute 파라메터에서 사용되어지기도 해서 WAS 서버 설정과 관련이 있다.
그러나 WAS 서버에서 Session Cluster 설정을 했다면 route 는 그냥 WAS 서버의 호출 주소를 적어줘도 된다.
CustomLog 설정
CustomLog 설정에서 rotatelogs 시에 파일명을 날짜별로 되도록 다음과 같이 수정한다.
1 |
CustomLog "|/opt/httpd/bin/rotatelogs /opt/httpd/logs/adm-7080-access_log.%Y-%m-%d.log 86400" combinedio |
지금까지 Apache 2.4 에서 기초적인 Reverse Proxy 설정을 기술했다. 기본적인 설정일뿐이며 이를 기반으로 다양한 기능들을 추가하면 된다. 추가적인 기능으로는 CustomLog 에서 파일형태(그림파일), URI 별로 쪼개서 로깅하기 혹은 IP 를 기반으로 차단하기, 이미지 파일 캐싱하기 등등이 있다.