컨테이너를 기반으로 Nginx Application Load Balacing을 구현해보자

yk hi·2021년 8월 10일
0

docker

목록 보기
10/16

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) 
  1. 로드벨런싱이 되는지 확인
    node01
    node02
    node03

같은 아이피로 node01 02 03에 접근할 수 있는 것을 확인하였다

Nginx 기본 알고리즘인 roundrobin방식으로 node 01 02 03에 균등하게 트레픽이 나간것을 확인

자 이렇게 nginx와 도커 컨테이너를 이용하여 Application LoadBalancer를 구현하였다!!

profile
엔지니어의 실력은 고통의 총합이다 <임백준 칼럼>

0개의 댓글

관련 채용 정보