Apache httpd 에 mod_proxy_cluster(구 mod_cluster) 모듈 컴파일방법
mod_proxy_cluster (구 mod_cluster) 는 Apache httpd 2.4.X 버전으로 올라가면서 명칭이 mod_proxy_cluster로 변경되었습니다.
mod_cluster는 WAS서버(jboss, wildfly, tomcat)에서 사용되는 모듈의 명칭이고
mod_proxy_cluster는 WEB서버(Apache httpd)에서 사용되는 모듈의 명칭으로 지정되었습니다.
Apache HTTPD mod_proxy_cluster 컴파일
먼저 필요한 의존성 패키지는 아래와 같습니다.
gccgcc-c++makeautoconf
$ yum install gcc gcc-c++ make autoconf
이후 소스코드를 git에서 받아와 컴파일 합니다.
$ git clone https://github.com/modcluster/mod_proxy_cluster.git
$ cd mod_proxy_cluster/native
$ mkdir build
$ cd build/
$ cmake ../ -G "Unix Makefiles"
-- Found APR: /usr/lib64/libapr-1.so
-- Found APRUTIL: /usr/lib64/libaprutil-1.so
-- Found APACHE: /usr/include/httpd
-- Configuring done
-- Generating done
-- Build files have been written to: /opt/mod_cluster-cmake/build
$ make
$ ls modules/
mod_advertise.so mod_cluster_slotmem.so mod_manager.so mod_proxy_cluster.so
만약 Apache httpd 서버가 패키지 설치된것이 아닌 수동 컴파일 하여 설치한 경우라면 아래와 같이 라이브러리 경로를 수동으로 지정해줘야 합니다.
$ cmake ../ -G "Unix Makefiles" \ -DAPR_LIBRARY=/app/httpd/lib/libapr-1.so \ -DAPR_INCLUDE_DIR=/app/httpd/lib \ -DAPACHE_INCLUDE_DIR=/app/httpd/include \ -DAPRUTIL_LIBRARY=/app/httpd/lib/libaprutil-1.so \ -DAPRUTIL_INCLUDE_DIR=/app/httpd/lib \ -DAPACHE_LIBRARY=/app/httpd/include
mod_proxy_cluster 설정
APACHE/conf/extra/httpd-modcluster.conf
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
LoadModule manager_module modules/mod_manager.so
LoadModule proxy_cluster_module modules/mod_proxy_cluster.so
LoadModule advertise_module modules/mod_advertise.so
LoadModule watchdog_module modules/mod_watchdog.so
<IfModule manager_module>
Listen 6666
ServerName localhost
# WebSocket 사용시
EnableWsTunnel
WSUpgradeHeader websocket
# mod_cluster reverse proxy용 서비스 정의
<VirtualHost *:6666>
# WAS가 연결하는 위치 정의
<Location />
Require ip 192.168.0
</Location>
# 이 매니저에 연결된 WAS그룹 이름 지정
# 만약 WAS 에서 직접 balancer 이름을 지정하는경우 무시된다.
ManagerBalancerName mycluster
# Advertise 기능 활성화 여부
ServerAdvertise Off
EnableMCPMReceive
# modcluster 관련 로그 출력
LogLevel info
ErrorLog logs/modcluster.log
# 원본 호스트의 요청 헤더를 백엔드로 넘겨줌
ProxyPreserveHost on
# Where administrator reads the console from
<Location /mod_cluster-manager>
SetHandler mod_cluster-manager
#Require ip 127.0.0
</Location>
</VirtualHost>
</IfModule>
virtualhost 설정
만약 VirtualHost 설정과 도메인별 WAS 컨테이너 설정을 별도로 하고 싶다면 아래 설정을 참고한다.
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot /app/httpd/htdocs
ServerName test1
ErrorLog logs/test1-error_log
CustomLog logs/test1-access_log common
# WAS처리를 제외할 경우 예제
# 정규식으로 매칭되는 경우에 대해 맨뒤에 ! 표시를 하여 제외처리를 한다.
ProxyPassMatch ^(/.*\.gif)$ !
# balancer1 밸런서로 요청 처리
# balancer1 이름은 ManagerBalancerName 로 지정된 이름을 사용하거나
# WAS에서 balancer 이름을 직접 지정한경우 그 이름으로 사용한다.
# WAS에서 balancer 이름을 지정한경우 ManagerBalancerName 은 무시된다.
ProxyPass /lds1/(.*) balancer://balancer1/
ProxyPassReverse /lds1/(.*) balancer://balancer1/
# test2 서비스의 경우 balancer2 로 연동
ProxyPass /lds2/(.*) balancer://balancer2/
ProxyPassReverse /lds2/(.*) balancer://balancer2/
</VirtualHost>
# 아래와 같이 여러개의 VirtualHost를 지정하는 경우 ManagerBalancerName을 하나로 같이 쓰기 어려우므로
# mod_cluster conf 에서 여러개의 Manager Virtual Host를 생성하여 ManagerBalancerName을 따로 사용하거나
# WAS별로 balancer 이름을 각각지정하여 구분하는것이 좋다.
# 보통은 여러 Manager Host를 구성하려면 포트를 여러개 만들어야 하므로 방화벽 정책 문제도 있는 관계로
# WAS쪽 balancer 이름을 구분하여 사용하는것이 바람직하다.
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot /app/httpd/htdocs
ServerName test1.localdomain
ErrorLog logs/test1-error_log
CustomLog logs/test1-access_log common
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
</VirtualHost>
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot /app/httpd/htdocs
ServerName test2.localdomain
ErrorLog logs/test2-error_log
CustomLog logs/test2-access_log common
ProxyPass / balancer://svc/
ProxyPassReverse / balancer://svc/
</VirtualHost>
예제
* 모든 요청을 WEB서버에서 처리하고 특정 패턴만 WAS로 처리할때
<VirtualHost *:80>
ServerName your-server-name
DocumentRoot /path/to/your/document/root
# Normal requests, not matching the /api/ pattern, are handled locally
ProxyPassMatch ^/(?!api/) !
# Requests matching the /api/ pattern are proxied to the WAS cluster
ProxyPass /api/ balancer://your-cluster-name/ stickysession=JSESSIONID
ProxyPassReverse /api/ balancer://your-cluster-name/
<Proxy balancer://your-cluster-name>
BalancerMember http://your-was-node1:your-was-port route=node1
BalancerMember http://your-was-node2:your-was-port route=node2
# Add more BalancerMember entries for additional WAS nodes
</Proxy>
</VirtualHost>
* 특정 요청만 WEB서버에서 처리하고 나머지는 모두 WAS에서 처리할
<VirtualHost *:80>
ServerName your-server-name
DocumentRoot /path/to/your/document/root
# Requests matching the /api/ pattern are handled locally
ProxyPassMatch ^(/api/.*)$ !
ProxyPassMatch ^(/resources/.*)$ !
ProxyPassMatch ^(/survey/.*)$ !
ProxyPassMatch ^(/publishing/.*)$ !
# All other requests are proxied to the WAS cluster
ProxyPass / balancer://your-cluster-name/ stickysession=JSESSIONID
ProxyPassReverse / balancer://your-cluster-name/
<Proxy balancer://your-cluster-name>
BalancerMember http://your-was-node1:your-was-port route=node1
BalancerMember http://your-was-node2:your-was-port route=node2
# Add more BalancerMember entries for additional WAS nodes
</Proxy>
</VirtualHost>
이후 JBoss / Wildfly mod_cluster 설정을 참고한다.