티스토리 뷰
WEB-WAS 연동은 사용자 요청에 따라 정적인 리소스는 웹서버가 처리하고 비즈니스 로직은 WAS에서 처리하도록 역할을 구분하는데 사용됩니다.
일반적으로 웹서버의 역할은 다음과 같습니다.
- proxy 서버 - 백엔드 WAS로 request by passing
- 정적 리소스 서비스 - html, js, css, 이미지 등
- 백엔드 WAS 로드밸런싱 - WAS가 HA로 구성될 경우(multi instance) 로드밸런싱 담당
1. 일반적인 WEB-WAS 연동 방법
일반적으로 WEB-WAS를 연동하는 방법은 WAS의 종류에 따라 달라지며 보통 WAS에서 제공하는 웹서버용 플러그인을 사용합니다.
이는 상용 WAS의 경우이며, JBoss, Tomcat과 같은 오픈소스의 경우, 웹서버 플러그인도 오픈소스를 사용하는데 정리하면 다음과 같습니다.
WAS |
WEB |
Plugin |
Provider |
Backend |
Backend 동적 proxy 기능 |
동적 proxy |
WebLogic |
Apache WebServer |
Proxy Plug-Ins |
벤더 제공 |
O |
DynamicServerList |
TCP/UDP |
|
iPlanet |
Proxy Plug-Ins |
벤더 제공 |
O |
DynamicServerList |
TCP/UDP |
|
Oracle Http Server |
Proxy Plug-Ins |
벤더 제공 |
O |
DynamicServerList |
TCP/UDP |
|
IIS |
Proxy Plug-Ins |
벤더 제공 |
O |
DynamicServerList |
TCP/UDP |
JEUS |
WebToB |
자체 내장 |
벤더 제공 |
O |
? |
? |
Tomcat |
Apache WebServer |
mod_jk |
오픈소스 |
O |
X |
X |
|
|
mod_proxy |
오픈소스 |
X |
X |
X |
JBoss |
Apache WebServer |
mod_jk |
오픈소스 |
O |
X |
X |
|
|
mod_proxy |
오픈소스 |
X |
X |
X |
|
|
mod_cluster |
오픈소스 |
O |
Advertise |
UDP |
2. 컨테이너 환경에서 WEB-WAS 연동
컨테이너, 도커 환경에서 간혹 정적 리소스와 웹애플리케이션 처리를 분리하기 위해 WEB-WAS 동시 구성을 필요로 하는데, 이 경우도 위에서 언급한 것처럼 하면 될까..?
단순히 순수한 도커 컨테이너에 대한 얘기라면 위 방법중 적절한 것을 사용하면 되지만, PaaS 환경이라면 얘기가 좀 달라질 수 있습니다.
컨테이너 환경에서 WEB-WAS를 연동할 때 고민해야 할 부분은 아래와 같습니다.
- TCP로 통신이 가능한가(UDP도 가능은 하나 사례가 별로 없음)
- Backend WAS의 AutoScale 에 대응할 수 있는가? -> 자동으로 proxy 대상으로 등록이 되어야 함
- 웹서버 컨테이너의 AutoScale 에 대응할 수 있는가?
- proxy configuration을 이미지 커스터마이징을 하지 않고 효율적으로 쉽게 설정할 수 있는가?
3. 오픈시프트 환경에서 WEB-WAS 연동을 위한 방법(JBossEAP + Apache Web Server를 기준으로)
이 내용은 이미 예전에 포스팅한 글에도 있을 것입니다. 하지만 안타깝게도 아직 이렇다 할만한 마음에 드는 구조를 찾지를 못했습니다...
아래 아키텍처는 보통 오픈시프트에서 WEB-WAS 연동을 할 경우 사용되는 방법이며 실제로 이러한 구성이 가능하다라는 의미이지 절대 권장하지 않습니다.
<오픈시프트에서 WEB-WAS 연동 방식 - 딱 봐도 맘에 들지 않는 느낌적인 느낌...>
이유는,
- 오픈시프트에는 웹서버 역할을 대신하는 Software Router(HAProxy)가 이미 존재합니다.
- 그럼에도 불구하고 Apache WebServer(httpd) 컨테이너를 앞단에 두는 것은 불필요한 중복입니다.
- JBoss Pod는 라이프사이클이 끝나면 IP를 다시 할당받으므로 웹서버의 proxy 설정을 IP로 할 수 없습니다. 이를 피하려면 Service 또는 Router를 가리켜야 하는데 이 또한 중복됩니다.
그럼에도 불구하고 WEB-WAS 구성을 요구하는 이유는
- 정적인 리소스 서비스를 WAS에서 하는 것은 비즈니스 로직을 처리해야 하는 WAS 입장에서는 불필요한 workload 일 수 있습니다.
- 기존의 서비스가 이미 WEB-WAS가 분리된 채로 구성되어 있어 둘 간의 통합이 어렵습니다(라고 쓰고 귀찮습니다 라고 읽는다).
방식 |
문제점 |
비고 |
mod_jk |
-> 이유는 pod 재시동시 IP가 매번 바뀌며 AutoScale을 고려하면 더더욱 그렇다.
|
|
mod_proxy |
-> 물론, Service에서 이를 어느정도 보완하기는 하지만 운영레벨에서 권장하기는 부족하다.
|
|
mod_cluster |
-> 오픈시프트는 standalone 모드만 지원한다. |
|
- 모든 request가 WEB을 거쳐가는 방식이 아니며 플러그인 모듈(ex. mod_jk, mod_cluster)을 거치지 않으므로 좀더 간결한 연결구조를 가집니다.
- 마찬가지로 mod_jk, mod_cluster 등 플러그인 모듈의 문제점(버그 등)과 의존성에서 벗어날 수 있습니다.
- WAS는 ajp 채널과 같이 플러그인 모듈을 위한 별도의 통신 채널을 열지 않아도 됩니다.
- 좀더 MSA의 모습에 가까워집니다. - Loosely coupled
- WEB/WAS 모두 자유로운 AutoScale이 가능합니다.
- Access Log 관리 - 이 경우 Access Log를 WEB/WAS 모두 관리하거나 소프트웨어 라우터(HAProxy)의 Access Log를 참조해야 합니다. 그러나 HAProxy는 다른 Pod에서도 사용할 수 있기 때문에 현실적으로는 WEB/WAS의 Access Log를 모두 관리해야 합니다.
- 단순한 Routing Rule - 이 방식의 경우 mime type에 따른 routing rule 설정은 어려워 보입니다. 현재 Kubernetes의 Route에서 설정할 수 있는 rule은 context root 기반입니다. 이 문제는 향후에 Istio 등을 활용할 경우 보다 다양한 routing rule을 적용할 수 있지 않을까 기대해 봅니다(문제는 아직 Istio를 써보지 않았음..)
- Origin 문서를 참조하면, TLS passthrough 를 사용할 경우 Path-Based routing을 사용할 수 없다고 합니다. TLS Passthrough 방식은 간단히 말해 WAS 쪽에 인증서가 있으며 Route는 이를 전달해 주는 역할만 합니다. 다른 방식으로는 Edge방식이 있으며 이는 클라이언트<->라우터 간 통신에서만 암호화를 합니다. 즉, 클라이언트 <-> 웹서버 간 SSL을 적용한 것과 비슷합니다. 또 다른 방식은 Reencryption 방식인데, 이는 클라이언트<->라우터, 라우터<->WAS 모두 별도의 인증서를 적용하는 방식입니다.
<WEB-WAS간 연동을 하지 않고 Route의 routing rule 만으로 서비스 호출 방안>
오픈시프트에 배포
- httpd
- JBoss EAP6.4
- 생성 결과
- JSP 에서 웹서버의 이미지를 호출하는 로직
일반적인 상대경로로 지정하였습니다.
.. 중략 ..
<p>
<font size=-1>Copyright (c) 1999-2000 by BEA Systems, Inc. All Rights Reserved. <%=tt%>
</font>
</font>
<image src="/images/jboss_pod.png">
<image src="/images/mongodb_pod.png">
<image src="/images/redis_pod.png">
<image src="/images/springboot_pod.png">
<image src="/images/tomcat_pod.png">
</body>
</html>
- 웹서버의 정적 리소스인 index.html에서 WAS로 호출하는 Form 태그
역시 상대경로로 지정하였습니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>This page is HTML from webserver</h1><br>
<form method="POST" action="/was/main">
<input type="text" name="txt" size="10" value="aaa">
<input type="submit">
</form>
</body>
</html>
- Route에서 Routing Rule 지정
www-ora01000.cloud.ocp.tg.com 이라는 FQDN으로 들어오면서 /images URI로 시작할 경우, www 서비스, 즉 웹서버로 분기합니다. 이는 JSP에서 /images 로 호출되는 정적 리소스를 웹서버로 분기해서 처리하기 위함입니다.
마찬가지로 html에서 WAS로 분기해야 할 경우에는 아래와 같이 www-ora01000.cloud.ocp.tg.com 으로 들어오는 FQDN에 대해서, /was/main(서블릿 맵핑 URI)로 들어오는 URI에 대해 was 서비스로 호출합니다.
테스트 결과
- 웹서버의 html에서 Servlet 호출
- JSP 호출시 웹서버의 이미지 호출 - JSP 페이지는 WAS에 있으며, 아래 Pod 이미지들은 웹서버에 있습니다..
'RedHat OpenShift > 기술문서' 카테고리의 다른 글
[서비스메시][배포금지] 마이크로서비스를 위한 서비스 메시 기술 ‘이스티오’가 뜨는 이유 (0) | 2018.05.28 |
---|---|
[Grafana] Prometheus/Elasticsearch 연동에 관한 짧은 글 (0) | 2018.04.20 |
[모니터링] Prometheus Introduction Gloosary (0) | 2018.02.13 |
[모니터링] Prometheus Introduction Overview (0) | 2018.02.12 |
[xPaaS] JBoss EAP 6.4/7.0 External DB 연동 (0) | 2018.02.06 |
- Total
- Today
- Yesterday
- 필름시뮬레이션
- xf14mm
- 퍼플라떼
- velvia
- Classic Chrome
- 연대앞
- 수지
- XT3
- XF23mm
- 논뷰
- m42 135mm
- m42
- 전붙이기
- SAVOR
- mf
- 황용식
- 손주등장
- 55mm
- 매거진스탠딩
- m42 55mm
- xt3 #MMCA #국립현대미술관
- 예전사진
- XF23
- 브런치
- XF14
- 23mm
- 보문호수
- 신촌
- 캠핑
- 야경
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |