본문 바로가기

미들웨어/Apache,Tomcat

Apache의 mod_proxy 설정

반응형

Apache의 mod_proxy 모듈을 사용해 back단으로 http call을 호출할 수 있다.

주로 WAS와 연동할 때 사용하며 그 외에도 proxy서버로 Apache를 구성하는 경우에도 사용한다.

 

해당 포스팅에서는 mod_proxy를 사용한 proxy설정 및 session clustering을 위한 sticky session 설정을 설명한다.


1. 모듈 로딩

  • Apache는 필요한 모듈을 Loading하는 방식으로 기능을 사용한다.
  • proxy관련 다양한 모듈(기능)이 존재하며 자세한 설명은 아래를 참고한다.
  • https://httpd.apache.org/docs/2.4/mod/
 

모듈 목록 - Apache HTTP Server Version 2.4

coreCore Apache HTTP Server features that are always available mpm_commonA collection of directives that are implemented by more than one multi-processing module (MPM) eventA variant of the worker MPM with the goal of consuming threads only for connections

httpd.apache.org

  • httpd.conf파일에 아래 모듈들을 Loading하도록 설정하였다.
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 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 lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so

 

 

2. 설정

  • 설정하는 위치는 상관이 없지만 일반적으로 HTTP요청에 대한 설정은 conf/extra/httpd-vhosts.conf파일에 설정한다.
  • 상황에 따라 여러가지 방법의 설정이 가능하다.

 

  • 받은 request를 back단으로 전달만 하는 단순한 proxy형태의 설정으로
    http://test.co.kr로 들어온 request를 모두 http://127.0.0.1:8088/ 로 전달한다.
<VirtualHost *:80>
    DocumentRoot "/webwas/Apache24/test"
    ServerName test.co.kr
    ServerAlias 127.0.0.1
    ErrorLog "|/webwas/Apache24/bin/rotatelogs /webwas/Apache24/logs/error_log.%Y%m%d 86400"
    CustomLog "|/webwas/Apache24/bin/rotatelogs /webwas/Apache24/logs/access_log.%Y%m%d 86400" combined

    ProxyRequests off
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:8088/
    ProxyPassReverse / http://127.0.0.1:8088/
</VirtualHost>

 

  • 다수의 back단으로 로드밸런싱 하는 형태로 http://test.co.kr로 들어온 request를 http://127.0.0.1:8088,8089로 전달한다. 아래 설정의 경우 무조건 RR로 전달하게 된다.
<VirtualHost *:80>
    DocumentRoot "/webwas/Apache24/test"
    ServerName test.co.kr
    ServerAlias 127.0.0.1
    ErrorLog "|/webwas/Apache24/bin/rotatelogs /webwas/Apache24/logs/error_log.%Y%m%d 86400"
    CustomLog "|/webwas/Apache24/bin/rotatelogs /webwas/Apache24/logs/access_log.%Y%m%d 86400" combined

    <Proxy balancer://cluster>
        BalancerMember http://127.0.0.1:8088/
        BalancerMember http://127.0.0.1:8089/
    </Proxy>

    ProxyRequests off
    ProxyPreserveHost On
    ProxyPass / balancer://cluster/
    ProxyPassReverse / balancer://cluster/
</VirtualHost>

 

  • session유지가 필요한 경우로 sticky session을 대신해 cookie값에 ROUTEID값을 넣어 stickyness하게 동작한다.
    아래의 경우 첫 요청이 http://127.0.0.1:8088/ 로 갔다면 cookie값에 ROUTEID로 server1_instance1이 들어가있으며
    이 후 요청에서는 Apache가 해당 Cookie값을 기준으로 http://127.0.0.1:8088/로 밸런싱 한다.
<VirtualHost *:80>
    DocumentRoot "/webwas/Apache24/test"
    ServerName test.co.kr
    ServerAlias 127.0.0.1
    ErrorLog "|/webwas/Apache24/bin/rotatelogs /webwas/Apache24/logs/error_log.%Y%m%d 86400"
    CustomLog "|/webwas/Apache24/bin/rotatelogs /webwas/Apache24/logs/access_log.%Y%m%d 86400" combined

    Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
    <Proxy balancer://cluster>
        BalancerMember http://127.0.0.1:8088/ route=server1_instance1
        BalancerMember http://127.0.0.1:8089/ route=server1_instance2
        ProxySet stickysession=ROUTEID
    </Proxy>

    ProxyRequests off
    ProxyPreserveHost On
    ProxyPass / balancer://cluster/
    ProxyPassReverse / balancer://cluster/
</VirtualHost>

 

  • 동일한 도메인에 context단위로 분기처리하는 경우
<VirtualHost *:80>
    DocumentRoot "/webwas/Apache24/test"
    ServerName test.co.kr
    ServerAlias 127.0.0.1
    ErrorLog "|/webwas/Apache24/bin/rotatelogs /webwas/Apache24/logs/error_log.%Y%m%d 86400"
    CustomLog "|/webwas/Apache24/bin/rotatelogs /webwas/Apache24/logs/access_log.%Y%m%d 86400" combined

    Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
    <Proxy balancer://cluster1>
        BalancerMember http://10.0.2.15:8081/ route=server1_ins1
        BalancerMember http://10.0.2.15:8082/ route=server1_ins2
        ProxySet stickysession=ROUTEID
    </Proxy>

    <Proxy balancer://cluster2>
        BalancerMember http://10.0.2.15:8083/ route=server1_ins3
        BalancerMember http://10.0.2.15:8084/ route=server1_ins4
        ProxySet stickysession=ROUTEID
    </Proxy>

    ProxyRequests off
    ProxyPreserveHost on
    ProxyPass /cluster1 balancer://cluster1/
    ProxyPassReverse /cluster1 balancer://cluster1/
    ProxyPass /cluster2 balancer://cluster2/
    ProxyPassReverse /cluster2 balancer://cluster2/
</VirtualHost>

 

3. health check

  • mod_proxy를 사용할 경우 proxy100continue항목에 의해 backend에 대한 health check가 이루어 진다.
    100continue는 HTTP1.1을 제공하는 backend에 사용 가능하며 HTTP status 100 code를 의미한다.
    backend에 header만 전달을 해보고 정상인 경우 body를 전달하는 방식이다.
  • BalancerMember에 등록된 backend서버가 down되면 해당 backend에 대한 접근을 60초 동안 disable한다.
    즉 8080포트를 사용하는 backend서버가 다시 기동되어도 해당 서버로는 request를 보내지 않는다.
[proxy:error] AH00959: ap_proxy_connect_backend disabling worker for (backend:8080) for 60s
  • backend disable에 대한 시간을 줄이기 위해선 아래와 같이 retry설정을 추가해 준다.
    아래와 같이 설정할 경우 backend disable에 대산 시간이 10초로 설정된다.
    <Proxy balancer://cluster>
        BalancerMember http://10.0.2.15:8080/ retry=10
        BalancerMember http://10.0.2.15:8081/ retry=10
    </Proxy>

 


HTTP통신외에 AJP로 전달하는 mod_proxy_ajp등의 모듈도 존재한다.

Tomcat과 연동할 때 모니터링등의 이유로 mod_jk를 사용했는데 최근엔 WEB/WAS사이 구간의 모니터링이 굳이 필요한가 싶고, 또 부하상황에서도 mod_proxy가 더 유연한게 아닌가 싶다.

 

반응형