본문 바로가기

Docker

docker로 nginx를 이용하여 로드밸런싱 하기

728x90
반응형
SMALL

[준비물]

 

server1, server2, server3, nginx

(이 글에서 server1, server2, server3 는 springboot 서버를 이용합니다.)

 

각자 리턴값이 1,2,3 을 뽑아주는 서버를 만들었습니다. (로드밸런싱 테스트를 한 눈에 보기 위해)

[구성]

server1

 @GetMapping("/test")
    public String get() {
        return "1";
    }

server1 의 Dockerfile

FROM amazoncorretto:17
ARG JAR_PATH=./build/libs
WORKDIR /app/backend
COPY ${JAR_PATH}/*.jar ./
ENTRYPOINT ["java","-jar","server1.jar"]

server2

 @GetMapping("/test")
    public String get() {
        return "2";
    }

server2 의 Dockerfile

FROM amazoncorretto:17
ARG JAR_PATH=./build/libs
WORKDIR /app/backend
COPY ${JAR_PATH}/*.jar ./
ENTRYPOINT ["java","-jar","server2.jar"]

server3

 @GetMapping("/test")
    public String get() {
        return "3";
    }

server3 의 Dockerfile

FROM amazoncorretto:17
ARG JAR_PATH=./build/libs
WORKDIR /app/backend
COPY ${JAR_PATH}/*.jar ./
ENTRYPOINT ["java","-jar","server3.jar"]

docker-compose.yml 설정

version: '3.8'

services:
  nginx:
    image: nginx
    restart: always
    ports:
      - 80:80
    volumes:
      - ./custom.conf:/etc/nginx/conf.d/custom.conf
    depends_on:
      - server1
      - server2
      - server3
  server1:
    build:
      context: ./loadbalancing
      dockerfile: Dockerfile
    restart: always
    container_name: server1
    ports:
      - 8080:8080
  server2:
    build:
      context: ./loadbalancing2
      dockerfile: Dockerfile
    restart: always
    container_name: server2
    ports:
      - 8081:8080
  server3:
    build:
      context: ./loadbalancing3
      dockerfile: Dockerfile
    restart: always
    container_name: server3
    ports:
      - 8082:8080

도커 컨테이너에 마운트 할 nginx 설정파일 설정.

 

    upstream api { # api는 arbitrary.
        server  server1:8080; # docker-compose.yml에서 올라가는 컨테이너명으로 >작성.
        server  server2:8080;
        server  server3:8080;
    }

    server {
        listen  80; # nginx를 통해 외부로 노출되는 port.
        server_name     localhost;

        location / {
          proxy_pass    http://api/; # arbitrary한 upstream명
        }
    }

보통 server1:8080 , server2:8080 server3:8080 자리에 각 서버의 아이피와 포트를 넣어야하는데

지금 테스트환경이 로컬이기때문에 또한 도커로 nginx를 설치 후 띄었기 때문에 세 서버 전부 8080으로 세팅 해줍니다.

 

[실행]

docker compose up --build -d

 

세 개의 서버(server1,server2,server3)와 nginx 설정이 잘되어있네요.

 

[설정 확인] 

 

볼륨을 이용하여 ./custom.conf:/etc/nginx/conf.d/custom.conf 마운트하였습니다.

마운트가 잘 되었는 지 확인해봅시다.

 

(docker exec -it containerId /bin/bash 하면 실행중인 도커 컨테이너에 들어갈 수 있어요.!)

custom.conf 라는 이름으로 마운트되었습니다.

 

 

[테스트]

새로고침 할때마다 server1 -> server2 -> server3 순서대로 서버가 붙고 있습니다.

 

로드밸런싱 알고리즘이 몇 가지 있는데

현재 아무 설정을 하지 않았습니다.

설정을 안하게 되면 default 인 round robin이 설정되는데 round robin을 사용하고있습니다.

 

 

[이외의 로드밸런싱 알고리즘]

round robin : (기본값)요청을 순서대로 처리한다.

least_conn : (최소 연결)각 요청을 서버에 할당된 가중치를 고려해 연결 수가 가장 적은 서버로 전송

ip_hash : 요청이 클라이언트 IP주소로 해싱 > 한번 요청 받은 서버가 있을 때 해당 서버에만 요청을 분배

least_time : 연결 수가 가장 적으면서 평균 응답시간이 가장 적은 쪽을 선택해서 분배 (Nginx Plus에서만 가능)

728x90
반응형
LIST