apache_httpd_에_mod_proxy_cluster_구_mod_cluster_모듈_컴파일방법

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)에서 사용되는 모듈의 명칭으로 지정되었습니다.

먼저 필요한 의존성 패키지는 아래와 같습니다.

  • 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

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 설정과 도메인별 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 설정을 참고한다.

로그인하면 댓글을 남길 수 있습니다.
  • apache_httpd_에_mod_proxy_cluster_구_mod_cluster_모듈_컴파일방법.txt
  • 마지막으로 수정됨: 2024/02/02 01:32
  • 저자 koov