[Docker] Nginx-tomcat 로드밸런서(Load Balancer) 구현하기 / feat.docker-compose

2021. 11. 17. 15:11Server

[Docker] Nginx-tomcat 로드밸런서(Load Balancer) 구현하기

 

 

# Tree

├── docker-compose.yml
├── mariadb
│   ├── config
│   └── data
├── nginx
│   └── config
│       └── nginx.conf
├── tomcat1
│   └── webapps
│       └── index.html
└── tomcat2
    └── webapps
        └── index.html

 

 

# docker-compose.yml

version: "3.3"

services:
  nginx:
    image: nginx
    container_name: nginx
    restart: always
    ports:
      - 80:80
    volumes:
      - ./nginx/config/nginx.conf:/etc/nginx/nginx.conf

  tomcat1:
    image: tomcat
    container_name: tomcat1
    ports:
      - 10001:8080
    volumes:
     - ./tomcat1/webapps/:/usr/local/tomcat/webapps/ROOT

  tomcat2:
    image: tomcat
    container_name: tomcat2
    ports:
      - 10002:8080
    volumes:
     - ./tomcat2/webapps/:/usr/local/tomcat/webapps/ROOT

1. nginx

 - ports : nginx의 port입니다. 외부 80번 포트, container 80번 포트로 매칭하였습니다

 - volumes : container 외부에서 관리하기 위해, 로드밸런싱 설정을 위해  nginx/config 폴더를 생성 후 nginx.conf 파일을 만들었습니다. nginx.conf 파일은 아래에서 설명드리겠습니다.

 

2. tomcat

 톰캣 설정부분 입니다. 2개의 톰캣을 container로 만들며, 외부 port를 다르게 설정하며, container 포트는 동일하게 설정합니다.

 

 

# nginx/config/nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    # include /etc/nginx/conf.d/*.conf;
    
    upstream tomcat {
        server 서버ip:10001;
        server 서버ip:10002;
        # 예시) server 123.45.678.999:10001;
        # 예시) server 123.45.678.999:10002;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://tomcat;
        }
    }
}

1. upstream {tomcat} : upstream을 설정해야 합니다.

서버ip:port로 지정할 수 있습니다.

 

nginx upstream이란?

 > proxy_pass를 통해 nginx가 받은 Request를 넘겨 줄 서버를 정의

 

 

## 옵션

# 참조 : http://nginx.org/en/docs/stream/ngx_stream_upstream_module.html
########## ip_hash
upstream tomcat {
    ip_hash;
    server 서버ip:10001;
    server 서버ip:10002;
}
ip_hash - ip로 분배한다. 만약 A라는 ip가 server1에 접속했으면 이후에도 
server1에 계속 접속하게 되며, 한번 접속한 ip는 계속 같은 서버를 사용한다.


########## least_conn
upstream tomcat {
    least_conn;
    server 서버ip:10001;
    server 서버ip:10002;
}
least_conn - 가중치를 고려하면서 연결된 접속자가 가장 적은 서버로 분배


########## least_time
upstream tomcat {
    least_time;
    server 서버ip:10001;
    server 서버ip:10002;
}

least_time - 연결된 접속자가 가장 적으면서 + 평균 응답시간이 가장 적은 쪽으로 분배

 

 

# 심플한 HTML 작성

## tomcat1/webapps/index.html

## tomcat2/webapps/index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    tomcat1 (tomcat2에서는 tomcat2)
</body>
</html>

 

 

# docker-compose up -d

 

 

# 웹실행

새로고침을 하면 tomcat1과 tomcat2가 번갈아 가면서 접속이 되는것을 확인할 수 있다.

 

 

 

 

 

# 참고

https://velog.io/@ruddms936/%EB%A1%9C%EB%93%9C%EB%B0%B8%EB%9F%B0%EC%8B%B1