Nginx - Tomcat 로드밸런싱

작성자 김성민
Nginx - tomcat 통신으로 Nginx가 설치된 서버에서 tomcat서버 키고 끄는 기능 테스트
다른 tomcat 서버가 죽어도 연결된 다른 tomcat이 연동되게 로드밸런싱

Nginx
    firewall 설정
    proxy 설정
tomcat
    firewall 설정
    ssh 설정

tomcat1 - 8.5.78

tomcat2 - 8.5.9

tomcat3 - 8.5.89

요약

// 서버 구별하기 위해 버전 다른 톰캣 설치
CentOS 4개 구동
CentOS - Nginx
CentOS - tomcat 8.5.78, tomcat 8.5.9, tomcat 8.5.89

tomcat이 설치된 CentOS 재부팅되면 자동으로 tomcat 시작 구현

Nginx - Tomcat 사이 로드밸런싱 구현
서버 부하분산 설정 <https://ko.linux-console.net/?p=7029#gsc.tab=0>

Nginx가 설치된 CentOS에 tomcat 3개의 서버 10초 간격으로
shutdown startup Shell Script 파일 생성

일정 시간마다 tomcat 구동 Shell Script 실행

docker 초기 설정

// docker login
docker login

// centos 이미지 가져오기
docker pull centos:7

// nginx와 Tomcat 컨테이너 간의 통신을 위해 Docker 네트워크 생성
docker network create my-network

// 컨테이너 실행 [ @-container] = [컨테이너 이름]
// docker run -d --name nginx-container --network my-network -p [접속포트]:[80] nginx
// docker run -d --name tomcat-container --network my-network -p [접속포트]:[8080] tomcat

// centos:7 컨테이너 실행
// --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro 는 systemctl 명령어를 사용하기 위함
docker run -d --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro --name centos-nginx --network my-network -p 8001:80 centos:7 /usr/sbin/init
docker run -d --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro --name centos-tomcat-1 --network my-network -p 7001:80 centos:7 /usr/sbin/init

centOS nginx 설치

// yum 외부 저장소 추가
vi etc/yum.repos.d/nginx.repo

// nginx.repo 공식문서에 나와있음
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

// nginx install
yum install -y nginx

// 방화벽
yun install firewalld
systemctl start firewalld

// 부팅시 자동 실행
systemctl enable firewalld

// 방화벽 포트 개방
// 포트 개방
firewall-cmd --permanent --zone=public --add-port=[포트]/tcp
// ip 접근 허용 규칙 추가
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="[서버 ip]" accept' --permanent
firewall-cmd --reload

// nginx.conf 파일 설정
// ... 아래 코드

// nginx 데몬 실행
systemctl start nginx
systemctl enable nginx

nginx 구성

# nginx.conf 파일 편집
# 수정 키보드의 insert 누르고 수정모드 활성화
# 저장 ESC > :wq > Enter
# upstream server에 backup을 사용하면 다른 tomcat이 죽으면 대체한다.
# weight= @  를 사용하면 숫자가 클수록 부하를 더 많이 가지게 된다.
# ip_hash 세션 지속 설정
# least_conn; 최소 연결 알고리즘
# least_time header; 최소 응답시간 알고리즘 (HTTP 응답 헤더 기준)

vi /etc/nginx/nginx.conf

# 설정 변경
server {
        listen [nginx 접속포트];
        server_name localhost;

        location / {
                proxy_pass <http://tomcat>;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}

upstream tomcat{
        ip_hash;
        # least_conn;
        # least_time (header | lasy_byte);

        server [tomcat-server1-ip]:[tomcat1-port] weight=5;
        server [tomcat-server2-ip]:[tomcat2-port] weight=3;
        server [tomcat-server3-ip]:[tomcat3-port] weight=3;
}

java 설치

// jdk 설치
yum install java-1.8.0-openjdk

// java 환경변수 등록
vi /etc/profile

...
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar

export JAVA_HOME PATH CLASSPATH

// 환경변수 적용
source /etc/profile

// 테스트
echo $JAVA_HOME
echo $PATH
echo $CLASSPATH

tomcat 설치

// tomcat, jdk, firewalld, wget 설치 해야한다.
yum install java-1.8.0-openjdk
yum install firewalld
yum install wget

// archive.apache.org/dist/tomcat/ 로 들어가서 원하는 tomcat version 선택 bin/ 폴더 내부에서 선택
wget -c [톰켓 파일 링크]

// 압축 해제
tar -zxvf apache-tomcat-8.5.85.tar.gz

// 디렉터리 이름 변경
mv apache-tomcat-8.5.85.tar.gz tomcat