참고
Nginx를 활용한 proxy
NOTE
Nginx란 트래픽이 많은 웹사이트의 서버(AWS)를 도와주는 비동기 이벤트 기반 구조의 경량화 웹 서버 프로그램이다.
Reverse Proxy Server 구성을 통해 로드밸런싱 구현
sudo apt update
sudo apt -y install nginx
sudo nginx -v
sudo systemctl status nginx.service
sudo netstat -nlp | grep 80
curl localhost:80
Bash
복사
nginx 설치 및 확인
sudo systemctl stop nginx.service
sudo apt autoremove nginx –y
sudo netstat -nlp | grep 80
Bash
복사
Nginx 초기화코드
Nginx 로드밸런싱 실습
NOTE
# 서버 구성
docker run -it -d -e SERVER_PORT=5001 -p 5001:5001 -h alb-node01 -u root --name=albnode01 dbgurum/nginxlb:1.0
docker run -it -d -e SERVER_PORT=5002 -p 5002:5002 -h alb-node02 -u root --name=albnode02 dbgurum/nginxlb:1.0
docker run -it -d -e SERVER_PORT=5003 -p 5003:5003 -h alb-node03 -u root --name=albnode03 dbgurum/nginxlb:1.0
# 컨테이너 확인
docker ps -a | grep node
# 컨테이너 네트워크 포트 확인
sudo netstat -nlp | grep 5001
sudo netstat -nlp | grep 5002
sudo netstat -nlp | grep 5003
Bash
복사
5001~5003의 포트에 서버를 올린다.
# nginx.conf (로드밸런싱 정보) 복사
sudo mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.org
sudo vi /etc/nginx/nginx.conf # 아래의 파일 복사
# nginx 재시작
sudo systemctl restart nginx.service
sudo systemctl status nginx.service
Bash
복사
nginx 설정파일 수정
events { worker_connections 1024; }
http {
# List of application servers
upstream backend-alb {
server 127.0.0.1:5001;
server 127.0.0.1:5002;
server 127.0.0.1:5003;
}
# Configuration for the server
server {
# Running port
listen 80 default_server;
# Proxying the connections
location / {
proxy_pass http://backend-alb;
}
}
}
Bash
복사
설정파일 내용
이제 80포트로 접속하면 Round Robind 형식으로 3개의 서버가 번갈아가며 나옴
Nginx 가중프 로드밸런싱 실습
NOTE
특정 컨테이너에 더 많이 가도록한다.
# Nginx 시작 및 설정파일 이동
docker run -d -p 8001:80 --name=proxy-container nginx:1.25.0-alpine
vi nginx.conf
docker cp nginx.conf proxy-container:/etc/nginx/nginx.conf
docker restart proxy-container
# 앞서 한것처럼 5001~5003 서버가 번갈아가며 나옴
curl localhost:8001
curl localhost:8001
curl localhost:8001
Bash
복사
events { worker_connections 1024; }
http {
upstream backend-alb {
server 192.168.56.101:5001 weight=60;
server 192.168.56.101:5002 weight=20;
server 192.168.56.101:5003
}
server {
listen 80 default_server;
location / {
proxy_pass http://backend-alb;
}
}
}
Bash
복사
가중치를 주는 방법
HAProxy를 활용한 컨테이너 Proxy
NOTE
HAProxy ⇒ 기존 하드웨어 스위치를 대처하는 소프트웨어 (L4, L7의 로드밸런싱 제공)!
# 도커 네트워크 생성
docker network create proxy-net
# 4개의 컨테이너를 동일 네트워크에 실행
docker run -d --name=echo-web1 --net=proxy-net -h echo-web1 dbgurum/haproxy:echo
docker run -d --name=echo-web2 --net=proxy-net -h echo-web2 dbgurum/haproxy:echo
docker run -d --name=echo-web3 --net=proxy-net -h echo-web3 dbgurum/haproxy:echo
docker run -d --name=echo-web4 --net=proxy-net -h echo-web4 dbgurum/haproxy:echo
docker ps -a | grep echo
Bash
복사
동일 네트워크에 다중 컨테이너 실행
# HAProxy 설정파일
vi haproxy.cfg
# HAProxy 실행 및 확인
docker run -d --name=haproxy-container \
--net=proxy-net -p 80:80 -p 8404:8404 \
-v $(pwd):/usr/local/etc/haproxy:ro \
haproxytech/haproxy-alpine:2.5
docker port haproxy-container
curl localhost:80
Bash
복사
# 글로벌 (기본설정)
global
stats socket /var/run/api.sock user haproxy group haproxy mode 660 level admin expose-fd listeners
log stdout format raw local0 info
# http L7설정
defaults
mode http
timeout client 10s
timeout connect 5s
timeout server 10s
timeout http-request 10s
log global
# 8404 통계포트
frontend stats
bind *:8404
stats enable
stats uri /
stats refresh 10s
# 프론트엔드 서버
frontend myfrontend
bind :80
default_backend webservers
# 백엔드 서버
backend
server s1 echo-web1:8080 check
server s2 echo-web2:8080 check
server s3 echo-web3:8080 check
Bash
복사
Nginx와 마찬가지로 로드밸런싱이 됨
HAProxy의 통계정보
L7 URI 방식 구성 1
NOTE
L7형식으로 실습을 진행한다.
# HAProxy 실행
docker run -d --name=haproxy-container \
--net=proxy-net -p 80:80 -p 8404:8404 \
-v $(pwd):/usr/local/etc/haproxy:ro \
haproxytech/haproxy-alpine:2.5
Bash
복사
global
stats socket /var/run/api.sock user haproxy group haproxy mode 660 level admin expose-fd listeners
log stdout format raw local0 info
defaults
mode http
timeout client 10s
timeout connect 5s
timeout server 10s
timeout http-request 10s
log global
frontend stats
bind *:8404
stats enable
stats uri /
stats refresh 10s
frontend myfrontend
bind :80
default_backend webservers
acl echo-web1 path_beg /echo-web1
acl echo-web2 /echo-web2
acl echo-web3 /echo-web3
use_backend echo-web1_backend if echo-web1
use_backend echo-web2_backend if echo-web2
use_backend echo-web3_backend if echo-web3
backend webservers
balance roundrobin
server s1 echo-web1:8080 check
server s2 echo-web2:8080 check
server s3 echo-web3:8080 check
backend echo-web1_backend
server s1 echo-web1:8080 check
backend echo-web2_backend
server s2 echo-web2:8080 check
backend echo-web3_backend
server s3 echo-web3:8080 check
Bash
복사
설정파일 내용
L7 URI 방식 구성 2
NOTE
docker run -d --name=echo-web1-item --net=proxy-net -h echo-web1-item dbgurum/haproxy:echo
docker run -d --name=echo-web2-item --net=proxy-net -h echo-web2-item dbgurum/haproxy:echo
docker run -d --name=echo-web3-basket --net=proxy-net -h echo-web3-basket dbgurum/haproxy:echo
docker run -d --name=echo-web4-basket --net=proxy-net -h echo-web4-basket dbgurum/haproxy:echo
docker run -d --name=haproxy-container --net=proxy-net -p 80:80 -p 8404:8404 -v $(pwd):/usr/local/etc/haproxy:ro haproxytech/haproxy-alpine:2.5
Bash
복사
global
stats socket /var/run/api.sock user haproxy group haproxy mode 660 level admin expose-fd listeners
log stdout format raw local0 info
defaults
mode http
timeout client 10s
timeout connect 5s
timeout server 10s
timeout http-request 10s
log global
frontend stats
bind *:8404
stats enable
stats uri /
stats refresh 10s
frontend myfrontend
bind :80
default_backend webservers
acl echo-web1-item path_beg /item
acl echo-web2-item path_beg /item
acl echo-web3-basket path_beg /basket
acl echo-web4-basket path_beg /basket
use_backend echo-web1_backend if echo-web1-item
use_backend echo-web1_backend if echo-web2-item
use_backend echo-web2_backend if echo-web3-basket
use_backend echo-web2_backend if echo-web4-basket
backend webservers
balance roundrobin
server s1 echo-web1-item:8080 check
server s2 echo-web2-item:8080 check
server s3 echo-web3-basket:8080 check
server s4 echo-web4-basket:8080 check
backend echo-web1_backend
server s1 echo-web1-item:8080 check
server s2 echo-web2-item:8080 check
backend echo-web2_backend
server s3 echo-web3-basket:8080 check
server s4 echo-web4-basket:8080 check
Bash
복사
참고로 경로없이 하면 4개가 RR형식으로 반환됨