![[NCP] 로드밸런서를 이용하여 WEB/WAS 서버 이중화 실습하기(Nginx/Tomcat)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHE6Uw%2FbtsCgY55Dow%2Fjwiqr4uEczKpKg6ASX75qk%2Fimg.png)
안녕하세요
이번 시간에는 로드밸런서를 통한 WEB/WAS 서버 이중화를 테스트해 보도록 하겠습니다.
0. 개요
업무 중 다음과 같이 WEB/WAS를 이중화하는 구성도를 확인했는데 이와 관련한 자세한 Hands-On 자료가 없어서 구성했던 내용을 기록해두려고 합니다. WEB/WAS를 이중화해야 하는 이유에 대해서는 아래에서 설명드리겠습니다.
1. WEB/WAS 이중화의 필요성
1. 역할 분리
(1) WEB 서버
정적인 콘텐츠(이미지, HTML 페이지 등)를 처리하고, 클라이언트로부터의 요청을 받아 정적 응답을 생성합니다.
(2) WAS 서버
동적인 콘텐츠(동적 페이지, 비즈니스 로직 등)를 처리하고, 데이터베이스와 상호 작용하여 동적 응답을 생성합니다.
2. 성능 최적화
(1) 로드 밸런싱
웹 서버와 WAS를 분리하고 로드 밸런서를 사용하면 트래픽을 여러 WAS 인스턴스로 분산시켜 부하를 분담할 수 있습니다. 이는 성능 향상과 함께 가용성을 향상시킵니다.
(2) 캐싱
웹 서버는 정적 콘텐츠를 캐싱하여 반복적인 요청에 빠르게 응답함으로써 성능을 최적화할 수 있습니다.
3. 확장성
(1) 독립적인 확장
웹 서버와 WAS를 각각 독립적으로 확장할 수 있습니다. 웹 서버는 정적 콘텐츠 처리를 늘리고, WAS는 동적 콘텐츠 처리를 늘려 시스템 전체적으로 높은 확장성을 제공할 수 있습니다.
4. 보안 강화
(1) 방화벽 설정
웹 서버를 통해 들어오는 트래픽을 관리하고, WAS는 내부에서 동작하므로 보안 설정을 향상시킬 수 있습니다.
(2) 보안 계층 구분
SSL/TLS와 같은 보안 프로토콜은 웹 서버에서 처리하고, 안전한 통신을 보장합니다.
5. 유지보수 용이성
(1) 업그레이드 및 롤백
각 구성 요소가 독립적으로 동작하므로, 웹 서버나 WAS의 업그레이드 및 롤백이 상대적으로 용이해집니다. 서비스 중단을 최소화할 수 있습니다.
6. 클라우드 환경에서의 최적화
(1) 자동 확장
클라우드 환경에서는 필요에 따라 자동으로 서버 인스턴스를 늘리거나 줄일 수 있는 자동 확장 기능을 활용할 수 있습니다.
(2) 클라우드 서비스 이점 활용
각 역할에 맞게 최적화된 클라우드 서비스를 선택하여 비용을 최적화할 수 있습니다.
7. 높은 가용성 및 신뢰성
(1) 이중화 및 페일오버
분리된 구성 요소를 복제하고 로드 밸런서를 통해 트래픽을 분산시키면 장애 발생 시에도 서비스 중단을 최소화하고 높은 가용성을 제공할 수 있습니다.
다음과 같은 이유로 WEB/WAS 서버를 보편적으로 분리하고 이중화합니다. 운영 환경이라면 사실상 필수적인 내용이고 테스트 환경이라면 비용 이슈가 있기 때문에 굳이 다음과 같은 구성을 가져가지 않아도 괜찮습니다.
2. WEB/WAS 이중화 구성하기(Nginx/Tomcat9)

실습해 볼 구성도는 다음과 같습니다. 기본적으로 End User의 요청은 External ALB에서 받아서 Web ▶ Internal ALB ▶ WAS로 통신이 이루어집니다. 3 티어 구조로 가져가게 되면 뒷단에 NLB와 DB 서버를 띄워서 구성할 수도 있습니다.
1. VPC 생성하기

VPC 이름 | IP 주소 범위 |
hyuk-cbe-test-vpc | 192.168.100.0/24 |
다음과 같이 오늘 실습에 사용할 VPC를 생성합니다.
2. Subnet 생성하기


Subnet 이름 | IP 주소 범위 | IGW 여부 | 용도 |
hyuk-cbe-lb-pub-01 | 192.168.100.0/27 | Public | LoadBalancer |
hyuk-cbe-svr-pub-01 | 192.168.100.32/27 | Public | 일반 |
hyuk-cbe-web-pri-01 | 192.168.100.64/27 | Private | 일반 |
hyuk-cbe-lb-pri-01 | 192.168.100.96/27 | Private | LoadBalancer |
hyuk-cbe-was-pri-01 | 192.168.100.128/27 | Private | 일반 |
hyuk-cbe-nat-pub-01 | 192.168.100.160/27 | Public | NAT Gateway |
다음과 같이 각 용도별로 IGW 여부별로 Subnet을 생성해 줍니다. Subnet 주소 범위는 /27로 나눠주었습니다.
3. ACG 생성하기
1. WAS ACG 설정하기

(1) Inbound 규칙 설정하기

다음과 같이 WAS 서버 인바운드에 대한 ACG를 설정하는데 TCP 내부 로드밸런서 대역으로 8080 포트(Tomcat 기본 포트)를 추가합니다.
(2) Outbound 규칙 설정하기

다음과 같이 WAS 서버 아웃바운드에 대한 ACG를 설정합니다.
2. WEB ACG 설정하기
(1) Inbound 설정하기

다음과 같이 WEB 서버 인바운드에 대한 ACG를 설정하는데 TCP 외부 로드밸런서 대역으로 80 포트(Nginx 기본 포트)를 추가합니다.
(2) Outbout 설정하기

다음과 같이 WEB 서버 아웃바운드에 대한 ACG를 설정합니다.
4. Server 생성하기


이중화를 위해 WEB/WAS 서버를 각각 2대 생성하고 위에서 생성한 ACG를 각 서버에 매핑합니다. 로드밸런서를 생성한 후에 Bastion 호스트를 통해 각 서버에 접속하여 필요한 설정을 진행하도록 하겠습니다.
5. Target Group 생성 및 설정하기

(1) Target Group (WAS) 생성하기

Nginx에서 proxy_pass 옵션을 통해 Tomcat으로 8080으로 프록시하기 때문에 포트는 8080으로 설정합니다.

다음과 같이 Health Check를 설정한 후 다음으로 넘어갑니다.

적용할 타겟으로 다음과 같이 WAS 서버 2대를 설정한 후 생성합니다.
(2) Target Group (WEB) 생성하기

웹 서버인 Nginx의 기본 포트가 80번이기 때문에 다음과 같이 HTTP 80 포트로 설정합니다.

WAS 타겟 그룹과 달리 Nginx에서 proxy_pass로 내부 로드밸런서로 던지기 때문에 healthcheck용도로 다음과 같이 설정합니다. 다음과 같이 /healthcheck.html을 통해 헬스체크 전용으로 생성합니다.

적용할 타겟은 WEB 서버 2대를 설정한 후 Target Group을 생성해 줍니다.
6. LoadBalancer 생성하기

(1) Internal LoadBalancer 생성하기

WAS 서버와 연결시킬 내부 로드밸런서이기 때문에 다음과 같이 Private IP로 설정합니다.

리스너는 다음과 같이 Tomcat의 기본 포트인 8080으로 설정합니다. Tomcat에서 서비스 포트를 변경하면 리스너도 따라서 변경해 주시면 됩니다. 만약 Nginx나 Tomcat이 아닌 다른 서비스를 이용한다면 해당 포트에 맞게 설정해주셔야 합니다. 타겟 그룹에서 WAS 타겟 그룹을 선택한 후에 생성해 줍니다.
(2) External LoadBalancer 생성하기

WEB 서버와 연결시킬 외부 로드밸런서이기 때문에 다음과 같이 Public IP로 설정합니다. 엔드 유저는 외부 로드밸런서의 도메인을 통해 접속하기 때문입니다.

리스너는 다음과 같이 Nginx의 기본 포트인 80으로 설정합니다. 타겟 그룹에서 WEB 타겟 그룹을 선택한 후에 생성해 줍니다.
7. NAT Gateway 생성하기

Private Subnet에 있는 서버에서 외부와 통신하기 위해 다음과 같이 NAT Gateway를 공인으로 생성해 줍니다
8. WEB/WAS 서버에 Nginx/Tomcat9 설치하기
1. WEB 서버 패키지 설치 및 설정하기
(1) Nginx 설치하기

// Nginx 설치하기 (WEB svr 1, 2 모두 설정)
apt update
apt install nginx -y
(2) Health Check 파일 생성하기

cd /etc/nginx
mkdir html; cd html
vi healthcheck.html
[vi 편집기(입력 모드)]
-----------------------
hello world
-----------------------
:wq
(3) Nginx Proxy 설정하기

// Nginx 설정
vi /etc/nginx/sites-available/default
upstream tomcat {
server <내 내부 로드밸런서 도메인>:8080;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location ^~ /healthcheck.html
{
root /etc/nginx/html;
}
location / {
# try_files $uri $uri/ =404;
proxy_pass http://tomcat;
}
}
다음과 같이 내 내부 로드밸랜서 도메인을 변수로 사용하여 proxy_pass 설정을 한 후 헬스체크를 위해 만들어둔 healthcheck.html을 통해 가능하게 끔 설정해 줍니다.
(4) Nginx 재시작 및 서비스 확인하기


systemctl restart nginx
// 80포트 서비스 확인
netstat -nltp
다음과 같이 nginx를 재시작한 후 헬스체크 시간이 임계치만큼 지나면 Target 그룹을 통해 타겟이 정상적으로 떠 있는지 확인할 수 있습니다.
(5) Target Healthcheck 확인하기

다음과 같이 Target 상태 확인을 통해 타겟에 대한 헬스체크가 정상적으로 되고 있는 것을 확인할 수 있습니다.
2. WAS 서버 패키지 설치 및 설정하기
// WAS 서버 2대 모두 설정해주세요
apt update
apt install tomcat9 -y
(1) tomcat9 설정 확인하기

vi /etc/tomcat9/server.xml
기본적으로 8080으로 설정되어 있기 때문에 서비스 포트 변경 시 다음 설정도 변경되어야 합니다.
(2) tomcat9 서비스 확인하기

systemctl status tomcat9
WAS 서버에서는 Tomcat9을 설치하는 것이 끝이기 때문에 다음과 같이 서비스가 잘 동작하는지 확인만 해줍니다.
(3) Target Healthcheck 확인하기

다음과 같이 Target 상태 확인을 통해 타겟에 대한 헬스체크가 정상적으로 되고 있는 것을 확인할 수 있습니다.
9. 서비스 확인하기

다음과 같이 외부 로드밸런서의 도메인으로 접근하면 80 포트로 접근했는데도 proxy_pass로 인해 tomcat이 떠 있는 WAS 서버가 로드되는 것을 확인할 수 있습니다. 다음과 같이 로드밸런서 2개를 이용하여 WEB/WAS를 분리된 이중화 환경을 구성할 수 있습니다.
3. SSL 적용하기 (추가)
https://eveningdev.tistory.com/189
[NCP] Certificate Manager를 이용해 로드밸런서에 SSL 인증서 적용하기
안녕하세요 이번 시간에는 저번 포스팅에서 진행했던 이중화된 WEB/WAS 상태에서 Certificate Manager를 이용해서 로드밸런서에 SSL 인증서를 적용하는 실습을 진행해 보겠습니다. 1. 사전 준비 사항 [NCP
eveningdev.tistory.com
위와 같이 WEB/WAS 이중화로 구성해도 암호화되지 않은 평문으로 통신되기 때문에 반드시 SSL을 적용해야 합니다. 위 게시글에서는 이러한 로드밸런서에 SSL을 적용하는 실습을 구성하였고, 추후에 WAF 구성 후 WAF 단에 SSL을 구성하는 실습을 추가하겠습니다.
이번 시간에는 로드밸런서를 통한 WEB/WAS 서버 이중화 테스트를 진행해 봤습니다.
네이버 클라우드 플랫폼 WEB/WAS 이중화 구성에서 국문으로 된 상세한 설정을 알려주는 포스팅이 없기 때문에 다음과 같이 쉽게 설정할 수 있도록 Hand-On을 진행하였습니다.
감사합니다.
'Cloud > Naver Cloud' 카테고리의 다른 글
[NCP] Certificate Manager를 이용해 로드밸런서에 SSL 인증서 적용하기 (2) | 2023.12.26 |
---|---|
[NCP] Certificate Manager 신규 기능 인증서 발급에 대해 알아보고 실습해보기 (2) | 2023.12.20 |
[NCP] 서로 다른 VPC에서 VPC Peering을 통한 내부 네트워크 통신 테스트하기 (1) | 2023.12.19 |
[NCP] Auto Scaling에서 Scale-Out 시 Init Script 적용하기 (0) | 2023.10.31 |
[NCP] NCP에서 외부(가비아)에서 구매한 도메인 Global DNS에 도메인 등록하기 (0) | 2023.10.30 |
클라우드, 개발, 자격증, 취업 정보 등 IT 정보 공간
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!