실습)

방법2) ubuntu에서 apache2(=centos의 httpd)를 설치

방법3) ubuntu에서 nginx로 리버스프록시 구성


ubuntu 24.04에서 nginx로 리버스 프록시

인스턴스 생성

  • was
    was의 프라이빗 주소 - 10.10.1.65

ubuntu@ip-10-10-1-65:~$ sudo -i
root@ip-10-10-1-65:~# apt update -y
root@ip-10-10-1-65:~# apt install -y unzip wget openjdk-11-jdk
root@ip-10-10-1-65:~# wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.36/bin/apache-tomcat-10.1.36.zip
root@ip-10-10-1-65:~# unzip apache-tomcat-10.1.36.zip
root@ip-10-10-1-65:~# mv apache-tomcat-10.1.36 tomcat
root@ip-10-10-1-65:~# chmod 777 -R tomcat
root@ip-10-10-1-65:~# ./tomcat/bin/startup.sh

# 외부에서 접근되는걸 확인

 

# 웹서버도 동일하게 ubuntu 20.04로 생성

  • 파일을 새로 생성하여 리버스 프록시를 구성
root@ip-10-10-1-18:~# apt update -y && apt install -y nginx
root@ip-10-10-1-18:/etc/nginx# vi /etc/nginx/conf.d/proxy.conf
server {
  listen 80;
  location /tom {
    proxy_pass http://10.10.1.65:8080/; # was의 주소
  }
}

root@ip-10-10-1-18:/etc/nginx# vi sites-enabled/default 

# 끝에 /까지 치면 리버스 프록시가 잘 동작한다.


커스텀 AMI(Amazon Machine Image)

내 입맛에 맞게 구성한 서버환경을 이미지화, 웹서버가 설치되어있는 서버를 이미지화

# 커스텀이미지 = 디스크라고 봐도 무방함

                          = 보안그룹이나 인스턴스유형, 서브넷같은 정보는 포함되어있지 않고, 운영체제 및 설치된 패키지 정도

# 프로비저닝: IT 인프라를 설정하고, 시스템과 사용자가 리소스를 사용할 수 있도록 하는 프로세스

 

이미지화의 장점:

  • 온디맨드(On-demand, 수요 발생하면 즉시) 가능 = 시간단축
  • 동일한 환경을 항상 재현가능 = 휴먼에러 방지 가능, 관리 용이
    → 트래픽이 증가하면 똑같은 서버를 여러개 띄우고, 트래픽이 감소하면 서버 제거 가능
    → scaling을 유동적으로 변경가능

인스턴스 생성

  • web1

  • nginx 설치
ubuntu@ip-10-10-1-210:~$ sudo -i
root@ip-10-10-1-210:~# apt install -y nginx
  • 본뜨고 enable 필수
root@ip-10-10-1-210:~# echo webserver > /var/www/html/index.html
root@ip-10-10-1-210:~# systemctl restart nginx
root@ip-10-10-1-210:~# systemctl enable nginx

# 목표: 나중에 이 이미지로 여러 인스턴스를 만들었을때 nginx가 잘 동작하는 것

# 만약 enable을 안하면 생성되는 모든서버들의 nginx는 동작 안함. 따라서 항상, '부팅이 될때'를 신경써줘야함.

# 인스턴스의 외부주소로 잘 되는지 확인

# 내가 커스터마이징할 상태를 잘 만들었다면, 인스턴스 재부팅해도 잘 동작하는지 확인, 가장 확실한 방법

# 재부팅 후에도 내가 의도한 동작을 잘 수행하고 있다면, 인스턴스를 ‘중지’ 후 이미지 만들기

인스턴스 이미지 생성

# 이미지 이름

# 이미지를 만들면 항상 스냅샷도 같이 생성된다. (이미지를 지우실때 스냅샷도 같이 지워주세요)

# 위 이미지를 베이스로 하여 web1과 web2 두개의 인스턴스를 생성. 보안그룹, 네트워크, 인스턴스유형은 동일하게 하고, web1는 pub-sub1에, web2는 pub-sub2에 둔다.

  • web1, web2 인스턴스 생성

  • web1로 접속 시 웹서버가 잘 동작하는지 확인 후 중지된 web이라는 서버는 삭제


ELB(Elastic Load Balancer)

네트워크 트래픽을 자동으로 분산하여 애플리케이션 확장성 개선

load: 부하 / balancing: 분산

→ 부하 분산기

 

로드밸런서의 두가지 역할

  1. 하나의 앤드포인트(접속지점)을 만들 수 있다.
  2. 부하를 분산 = 번갈아가면서 접속시켜준다. (라운드로빈, 혹은 헬스체크를 통한 분산, 랜덤)

로드밸런서의 이점

  1. 보안
  2. 고가용성 및 자동 크기 조정
  3. 실시간 모니터링 및 병목 현상 파악

로드밸런서의 종류

  • CLB(Classic): Layer4, 7 부하분산 지원
    TCP/HTTP/HTTPS/SSL 지원
  • ALB(Application): Layer7 부하분산 지원
    HTTP/HTTPS 트래픽 로드밸런싱
  • NLB(Network): Layer4 부하분산 지원
    TCP/UDP 트래픽 로드밸런싱
  • GWLB(Gateway): Layer3에서 작동, 트래픽 체크하는 솔루션(기존 LB와 다름)

ALB(Application LB)

7계층까지 본다 = http서비스를 웹서버에 보내줄 수 있다 = 서비스를 기준으로 밸런싱

ALB(Application LB) 생성

  • ALB의 2가지 체계

1. internet facing: 퍼블릭 서브넷에 둬야 외부랑 통신 가능

2. internal: 프라이빗 서브넷에 둬야 함

# 서브넷 선택 잘하기

  • 리스너 설정

  • 대상 그룹 생성

# 우리는 web1,web2라는 인스턴스가 대상그룹이 될것이기 때문에 이걸 선택

상태 검사(health check)

  • 상태 검사 설정


  • 보류 중인 것으로 포함 버튼 클릭 후 대상 그룹 생성


  • 새로고침 후 대상 그룹에 추가

  • 생성한 ALB 확인

  • 접속주소로 접근하면 web1, web2가 랜덤으로 뜸

# 브라우저의 쿠키 혹은 7계층까지 인식을 못하는 로드밸런서의 경우, 로드밸런싱이 안되는것처럼 보일 수 있음
    = webserver1만 계속 뜨는 경우

  • 접속주소로 curl 찍는 방법이 제일 정확함
root@ip-10-10-1-126:~# curl web-alb-966664809.ap-northeast-2.elb.amazonaws.com
webserver1
root@ip-10-10-1-126:~# curl web-alb-966664809.ap-northeast-2.elb.amazonaws.com
webserver2
  • web-alb의 리스너

  • web-tg, 대상그룹의 상태 검사 확인


ALB(Application LB) 제거

  • 로드밸런서 삭제

  • 타겟그룹 삭제


실습)

NLB(Network LB) 생성

비슷한 방식으로 web1,web2를 타겟그룹으로 하는 NLB를 만들어서 외부접속을 테스트 해보세요!

  • NLB 구성

ALB의 경우, 프로토콜의 서비스 선택이 가능했지만,

NLB의 경우, 선택하게 된다면, 생성이 안될수도 있음

  • 대상 그룹 생성

  • 앤드포인트 접속

root@ip-10-10-1-126:~# curl web-nlb-671a0c64080a6e7a.elb.ap-northeast-2.amazonaws.com
webserver1
root@ip-10-10-1-126:~# curl web-nlb-671a0c64080a6e7a.elb.ap-northeast-2.amazonaws.com
webserver2

실습1)

ALB를 만들어보세요.
해당 ALB의 DNS이름:80 으로 접속했을때 하나의 AMI를 베이스로 만들어진 두 인스턴스 각각의 HOST IP가 출력되도록 해보세요. tomcat으로 하시면 됩니다. 타겟그룹의 HOST들은 AMI로 생성된 인스턴스여야 합니다. ALB는 한개를 만드시고, HOST의 IP는 최소 두개가 출력되게 해보세요.(서버 두개이상 만들라는 뜻) tomcat을 wget으로 받으셔서 하세요! 보여질 페이지를 수정하진 마세요!

인스턴스 생성

  • tomcat 생성

  • tomcat 연결 후 패키지 설치
root@ip-10-10-1-220:~# sudo -i
root@ip-10-10-1-220:~# apt update -y
root@ip-10-10-1-220:~# apt install -y unzip wget openjdk-11-jdk
root@ip-10-10-1-220:~# wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.36/bin/apache-tomcat-10.1.36.zip
root@ip-10-10-1-220:~# unzip apache-tomcat-10.1.36.zip
root@ip-10-10-1-220:~# mv apache-tomcat-10.1.36 tomcat
root@ip-10-10-1-220:~# chmod 777 -R tomcat
  • tee 명령 = cat 이랑 동일
    차이: 입력된 내용을 한번 더 출력하는것
tee /etc/systemd/system/tomcat.service <<EOF
[Unit]
Description=tomcat10
After=network.target syslog.target

[Service]
Type=forking
Environment="/root/tomcat"
User=root
Group=root
ExecStart=/root/tomcat/bin/startup.sh
ExecStop=/root/tomcat/bin/shutdown.sh

[Install]
WantedBy=multi-user.target
EOF
  • 새로 생성한 tomcat이라는 데몬서비스를 등록
root@ip-10-10-1-220:~# systemctl daemon-reload
root@ip-10-10-1-220:~# systemctl restart tomcat
root@ip-10-10-1-220:~# curl localhost:8080
  • 필요한 파일 수정
root@ip-10-10-1-220:~#  cd /root/tomcat/webapps/ROOT
root@ip-10-10-1-220:~/tomcat/webapps/ROOT# vi index.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<html>
    	<head><title>hello world</title></head>
    	<body>
    	<h2>
            	TOMCAT TEST<br><br>
            	time : <%= new java.util.Date()%>
            	<%@ page import="java.net.InetAddress" %><br>
            	<%InetAddress inet= InetAddress.getLocalHost();%>
            	WAS ip : <%=inet.getHostAddress()%>
    	</h2>
 
 
    	</body>
</html>
root@ip-10-10-1-220:~# systemctl restart tomcat
root@ip-10-10-1-220:~# systemctl enable tomcat
  • tomcat-ami 생성

  • 인스턴스 2개 생성

  • AMI 잘받아옴 확인

  • tomcat 인스턴스 제거 후 ALB 생성
    리스너 포트: 80

  • 대상그룹 생성
    포트: 8080

  • ALB 확인

  • DNS로 접속

  • 결과 확인


실습2)

ALB를 만들어보세요.
최소 각각 1쌍 이상(web두개, was두개)의 web,was를 생성하며 DB는 제외한 2 tier구조를 만들어보세요. ELB를 사용해야한다면 ALB를 사용하세요. 사용자는 web의 /tomcat 경로로 접속했을때 was로 리버스 프록시 되어야합니다. tomcat은 systemd를 통해 데몬으로 만드세요.

1. WAS instance 생성

아파치 설치 후 위의 실습 과정 진행

# was 실행 잘되는 것 확인 → 이미지화 준비 완료

2. WAS ami 생성

3. WAS ami 사용한 instance 생성

  • tom1
    : red hat
  • tom2
    : red hat

4. WAS ALB 생성

# DNS로 접속 잘되는 것 확인

5. WEB instance 생성

[ec2-user@ip-10-10-1-133 ~]$ sudo -i
[root@ip-10-10-1-133 ~]# setenforce 0
[root@ip-10-10-1-133 ~]# yum install -y httpd
[root@ip-10-10-1-133 ~]# vi /etc/httpd/conf/httpd.conf
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

<VirtualHost *:80> # 80번 포트로 들어오는 모든 ip에 대한 설정
    ProxyRequests Off
    ProxyPreserveHost On
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    ProxyPass /tomcat 
http://was-alb-494750055.ap-northeast-2.elb.amazonaws.com:8080/
    ProxyPassReverse /tomcat 
http://was-alb-494750055.ap-northeast-2.elb.amazonaws.com:8080/
</VirtualHost>
[root@ip-10-10-1-133 ~]# systemctl restart httpd
[root@ip-10-10-1-133 ~]# systemctl enable httpd

# web 실행 잘되는 것 확인 → 이미지화 준비 완료

WEB 퍼블릭 주소/tomcat을 입력했으나 503 service unavailable 문제가 생김

SELINUX, 방화벽 등의 설정 문제 확인 → setenforce 0

6. WEB ami 생성

7. WEB ami 사용한 instance 생성

  • web2
  • web3

8. WEB ALB 생성

헬스체크에 unhealthy라 뜨며 disabled되는 문제가 발생했다.

1. red hat으로 만들어서 /var/www/html/index.html이 없다. 각 web2, web3에 추가 설정 (비추)

2. 헬스케어 경로를 실제 보유하고 있는 파일의 경로로 지정 (강추)

3. web1에 var/www/html/index.html을 포함해 ami 인스턴스 alb 생성 (이상적)

[ec2-user@ip-10-10-1-132 ~]$ sudo -i
[root@ip-10-10-1-132 ~]# cd /var/www/html
[root@ip-10-10-1-132 ~]# vi index.html
[root@ip-10-10-1-132 html]# systemctl restart httpd
[root@ip-10-10-1-132 html]# systemctl enable httpd

# index.html 추가해준 이후에 dns 주소로 접근되는것 확인
# dns/tomcat 주소로 프록시 설정 잘한것 확인


(listener: 80) web1 ALB (tg: 80) web2(proxy: 8080) (listener: 8080) was1 ALB (tg: 8080) tom1(8080)

                                                       web3(proxy: 8080)                                                                   tom2(8080)