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 컴파일
먼저 필요한 의존성 패키지는 아래와 같습니다.
gcc
gcc-c++
make
autoconf
$ 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 설정을 참고한다.
로그인하면 댓글을 남길 수 있습니다.