Load Balancing이란?
컴퓨터 자원들에게 작업을 나누는 것을 의미한다. 이로써 가용성 및 응답시간을 최적화 시킬 수 있다
Nginx에 내장되어 있는 Load Balancing 알고리즘을 통해
Application Load Balacer를 구현해보도록 하자
1.nginx 설치
sudo apt -y install nginx
2.nginx 상태 확인
root@hostos1:~# nginx -v
nginx version: nginx/1.14.0 (Ubuntu)
root@hostos1:~# systemctl status nginx.service
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: en
Active: active (running)
root@hostos1:~# netstat -nlp | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 9972/nginx: master
tcp6 0 0 :::80 :::* LISTEN
3.로드벨런싱당할 컨테이너 3대 생성
root@hostos1:~# docker run -itd -e SERVER_PORT=5001 \
-p 5001:5001 \
-h alb-node01 \
-u root \
--name=alb-node01 \
dbgurum/nginxlb:1.0
node2와 node3도 동일하게 생성
root@hostos1:~# docker run -itd -e SERVER_PORT=5002 -p 5002:5002 -h alb-node02 -u root --name=alb-node02 dbgurum/nginxlb:1.0
fdb4739d8f24063689a32fb9180bac65fd80814604f6f38159540ad55a15ddf7
root@hostos1:~# docker run -itd -e SERVER_PORT=5003 -p 5003:5003 -h alb-node03 -u root --name=alb-node03 dbgurum/nginxlb:1.0
b09c38070272cb4f1ed2d154252a6c238128619ddb2438566547620586c9ac15
4.컨테이너 확인
root@hostos1:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b09c38070272 dbgurum/nginxlb:1.0 "/cnb/lifecycle/laun…" 47 seconds ago Up 46 seconds 0.0.0.0:5003->5003/tcp, :::5003->5003/tcp alb-node03
fdb4739d8f24 dbgurum/nginxlb:1.0 "/cnb/lifecycle/laun…" About a minute ago Up About a minute 0.0.0.0:5002->5002/tcp, :::5002->5002/tcp alb-node02
ee51a5202771 dbgurum/nginxlb:1.0 "/cnb/lifecycle/laun…" 2 minutes ago Up 2 minutes 0.0.0.0:5001->5001/tcp, :::5001->5001/tcp alb-node01
포트확인
root@hostos1:~# netstat -nlp | grep 5001
tcp 0 0 0.0.0.0:5001 0.0.0.0:* LISTEN 10886/docker-proxy
tcp6 0 0 :::5001 :::* LISTEN 10893/docker-proxy
root@hostos1:~# netstat -nlp | grep 5002
tcp 0 0 0.0.0.0:5002 0.0.0.0:* LISTEN 11229/docker-proxy
tcp6 0 0 :::5002 :::* LISTEN 11236/docker-proxy
root@hostos1:~# netstat -nlp | grep 5003
tcp 0 0 0.0.0.0:5003 0.0.0.0:* LISTEN 11551/docker-proxy
tcp6 0 0 :::5003 :::* LISTEN
정상 작동 확인
5.hostos의 nginx.conf 파일 수정
기존의 nginx.conf는 웹서버용 conf파일 로드벨런싱용 conf파일로 수정해보자
root@hostos1:~# cd /etc/nginx/
root@hostos1:/etc/nginx# mv nginx.conf nginx.conf.web
기존의 nginx.conf 파일을 백업하고
새로 작성
root@hostos1:/etc/nginx# vi nginx.conf
events { worker_connections 1024; }
http {
upstream backend-alb {
server localhost:5001;
server localhost:5002;
server localhost:5003;
}
server {
listen 80 default_server;
location /{
proxy_pass http://backend-alb;
}
}
}
worker_connection 커넥션 수 1024개로 설정
seerver listen 80 80번 포트로 들어오는 요청에 응답
location / 80번 포트에 / url로 들어오는 요청에 응답
proxy_pass 80번 포트에 / url로 오는 요청을 http://backend-alb; 여기로 보내준다
http upstream proxy_pass를 통해 보내줄 url을 설정
server localhost:5001 weight=6;
server localhost:5002 weight=2;
server localhost:5003 weight=2;
weight 옵션을 줘서 가중치를 설정할 수 도 있다!
6.nginx.conf 수정후 nginx 상태확인
root@hostos1:/etc/nginx# systemctl restart nginx.service
root@hostos1:/etc/nginx# systemctl status nginx.service
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: en
Active: active (running)
같은 아이피로 node01 02 03에 접근할 수 있는 것을 확인하였다
Nginx 기본 알고리즘인 roundrobin방식으로 node 01 02 03에 균등하게 트레픽이 나간것을 확인
자 이렇게 nginx와 도커 컨테이너를 이용하여 Application LoadBalancer를 구현하였다!!