본문 바로가기

WAS/JBoss&WildFly

Reverse Proxy 설정

728x90

https://atl.kr/dokuwiki/doku.php/jboss_eap_7_reverse_proxy_%EA%B5%AC%EC%84%B1

 

jboss_eap_7_reverse_proxy_구성 [AllThatLinux!]

원래대로라면 추천방법을 사용하여 외부망 WEB - 내부망 WAS 형태로 연동하는것을 권장하지만 그게 불가능한 경우에 구성하는 방법이다. 일반적으로 내/외부망이 분리된 곳에서 외부망 서비스를

atl.kr

 

외부망 WEB -> 내부망 WAS에 접근하는 것이 일반적으로 추천하는 방법이지만,

별도의 망을 두어 구성해야하는 상황이 있는 경우에는 Reverse Proxy 방법을 통하여 JBoss를 구성해야 한다.

요약하면 이런 상황에서 구성하는 방법이다.

 

1) 외부망에는 보안상 또는 특정한 사유로 인해 소스나 DB등을 위치시킬수 없는 경우

2) 이미 내부에 구현된 서비스를 외부로 서비스하고자 하는 요청이 있는 경우

3) (확실친 않음) 내부망에 있는 환경에서 외부 API를 사용하고자 하는 경우

 

현재 나는 102 장비에만 reverse 라는 app을 배포해둔 상황이다.

 

[101 환경]

 

[102 환경]

 

101장비에서 102 장비에 배포된 앱에 접근하기 위한 설정을 위해, 아래의 과정을 수행

1. 프록시 핸들러 추가

리버스 프록시 핸들러는 undertow 서브 시스템에 추가하는 작업.

이 작업은 리버스 프록시 역할을 해주는 핸들러를 생성하는 단계.

[standalone@192.168.56.101:9990 /] /subsystem=undertow/configuration=handler/reverse-proxy=LBProxy/:add(cached-connections-per-thread=5,connection-idle-timeout=60,connections-per-thread=10,max-request-time=-1,problem-server-retry=30,request-queue-size=10,session-cookie-names=JSESSIONID)
{"outcome" => "success"}

옵션은 필요에 따라 선별하여 사용하면 됨.

 

2. remote host 에 대한 아웃바운드 소켓 바인딩 설정

원격 호스트에 대한 아웃바운드 소켓 바인딩을 정의하는 과정이다.

102 장비의 IP와 AJP 포트를 기입해준다.

[standalone@192.168.56.101:9990 /] /socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=backend-host1/:add(host=192.168.56.102,port=8009)
{"outcome" => "success"}

 

3. 리버스 프록시 핸들러에 remote hosts 추가

리버스 프록시를 서비스하기 위한 호스트를 추가하는 작업이다.

앞서 말했듯이 현재 호출한 이 페이지의 경우. 2번장비에만 배포가 되어있는 상태이다.

 

이걸 리버스 프록시를 통해 서비스 하기 위해서는 아래의 작업이 필요하다.

※ 아래의 node21은 102장비에 있는 JBoss 인스턴스이다.

[standalone@192.168.56.101:9990 /] /subsystem=undertow/configuration=handler/reverse-proxy=LBProxy/host=backend-host1/:add(instance-id=node21,outbound-socket-binding=backend-host1,path=/reverse,scheme=ajp)
{"outcome" => "success"}

 

4. default-server의 location 태그에 핸들러 추가

[standalone@192.168.56.101:9990 /] /subsystem=undertow/server=default-server/host=default-host/location=\/reverse/:add(handler=LBProxy)
{"outcome" => "success"}

 

5. 테스트

1번 장비에는 reverse라는 APP이 없는 것을 확인

 

2번 장비에만 APP이 존재함

 

1번 장비 IP를 통하여 APP을 호출

[테스트 페이지]

<%@ page contentType="text/html;charset=UTF-8" %>
<%@ page import="java.net.InetAddress" %>
<%@ page import="java.util.Date" %>

<%
String nodeName = System.getProperty("jboss.node.name");
if(nodeName == null){
    nodeName = System.getenv("HOSTNAME");
}

String hostname = InetAddress.getLocalHost().getHostName();
String hostAddress = InetAddress.getLocalHost().getHostAddress();
String sessionId = session.getId();
String clientIp = request.getRemoteAddr();
String xff = request.getHeader("X-Forwarded-For");
%>

<html>
<head>
<title>WAS Node Test</title>
<style>
body { font-family: Arial; margin: 40px; }
table { border-collapse: collapse; width: 700px; }
th, td { border:1px solid #ccc; padding:8px; text-align:left; }
th { background:#f2f2f2; }
</style>
</head>

<body>

<h2>WAS Node Identification Page</h2>

<table>
<tr><th>Item</th><th>Value</th></tr>

<tr>
<td>Current Time</td>
<td><%= new Date() %></td>
</tr>

<tr>
<td>Node Name</td>
<td><%= nodeName %></td>
</tr>

<tr>
<td>Hostname</td>
<td><%= hostname %></td>
</tr>

<tr>
<td>Server IP</td>
<td><%= hostAddress %></td>
</tr>

<tr>
<td>Session ID</td>
<td><%= sessionId %></td>
</tr>

<tr>
<td>Client IP</td>
<td><%= clientIp %></td>
</tr>

<tr>
<td>X-Forwarded-For</td>
<td><%= xff %></td>
</tr>

<tr>
<td>Request URL</td>
<td><%= request.getRequestURL() %></td>
</tr>

<tr>
<td>Request URI</td>
<td><%= request.getRequestURI() %></td>
</tr>

</table>

</body>
</html>