3계층 아키텍처 실습 정리

rekv·2024년 12월 5일

BEYOND SW CAMP

목록 보기
14/30

공통

IP 변경하기

sudo su - root

관리자로 로그인

apt update -y

운영체제에서 사용 가능한 패키지들과 그 버전에 대한 정보를 업데이트 (레포지토리 목록 갱신)

apt-get install openvswitch-switch-dpdk

vsdb-server.service is not running 에러 방지를 위해서 openvswitch-switch-dpdk 패키지를 깔아주기

vi /etc/netplan/00-installer-config.yaml

/etc/netplan/00-installer-config.yaaml 파일을 수정해 서버의 IP를 바꿀 수 있음

network:
  etherenets:
    ens33:
      dhcp4: false
      addresses :
        - 192.168.145.77/24    # 서브넷으로 고정 위치 확인 후 지정할 ip 설정
      nameservers:
        addresses: [8.8.8.8]
      routes:
        - to: default
          via: 192.168.145.2   #내 컴퓨터의 Gateway

netplan apply

수정이 완료되면 적용하는 걸 잊지 말자

nginx

설치

apt install nginx

실행

systemctl restart nginx

상태 확인

systemctl status nignx

멈추기

systemctl stop nginx

systemctl 명령어는 이후 설치할 HaProxyMariaDB에서도 동일하게 사용할 수 있다.

NAT와 포트포워딩

Edit -> Virtual Network Editor를 통해 내가 만든 VM 서버의 접속 포트를 지정할 수 있다.

내 컴퓨터에서 내 가상 머신의 서버로 들어갈 떄는 [가상머신 IP]
외부 컴퓨터에서 내 가상 머신의 서버로 들어올 때는 [내 컴퓨터의 IP] : [포트포워딩한 번호]

HAProxy

IP 설정

vi /etc/netplan/00-installer-config.yaml

network:
renderer: networkd
  ethernets:
    ens33:
      addresses:
        - 10.10.10.100/24
      nameservers:
        addresses: [8.8.8.8]
      routes:
        - to: default
          via: 10.10.10.2
  version: 2

앞서 IP 설정에서 수정했던 것과 조금씩 다르다는 걸 유념하자

설치

apt install haproxy

실행

systemctl restart haproxy

부하분산 확인

vi /etc/haproxy/haproxy.cfg

맨 마지막 줄에 다음 내용을 추가

listen stats
	bind *:9000 #접속 포트 지정
    mode  http
    option dontlog-normal
    stats enable
    stats realm Haproxy\ Statistics #브라우저 타이틀
    stats uri /stats #stat를 제공할 uri

분산된 서버와 연결

nginx

vi /etc/haproxy/haproxy.cfg

frontend webserver
  bind *:포트번호 #포트번호 주의
  mode http
  default_backend nginx-server

backend nginx-server
  mode http
  balance roundrobin
  option httpchk GET /
  server nginx1 100.100.100.120:80 check
  server nginx2 100.100.100.200:80 check

mariadb

listen mariadb
	bind *:3306
	mode tcp
	balance roundrobin
#	option mysql-check user 유저명
	server db1 mysqld1 [ip]:3306 check
	server db2 mysqld2 [ip]:3306 check

위의 내용을 haproxy.cfg에 추가 후 option을 사용했다면 mariadb에서 유저 추가

mysql>use mysql;
mysql>insert into user (Host, User) values ('haproxy서버의IP', 'haproxy');
mysql>flush privileges;

MariaDB

설치

apt install -y mariadb-server

설정

vi /etc/mysql/mariadb.conf.d/50-server.cnf

27번 라인을 아래와 같이 변경

bind-address = 0.0.0.0 #지정된 주소 없음 (모든 IP 허용)

DB 생성 및 사용자 생성과 권한 추가

CREATE USER '유저이름'@'%' IDENTIFIED BY '비밀번호'; #사용자 생성
SELECT user, host FROM mysql.user; #생성 확인
GRANT ALL PRIVILEGES ON DB이름.* TO '유저이름'@'%'; #계정에 권한 부여
FLUSH PRIVILEGES; #권한 적용

미러사이트 구성

MASTER 설정

vi /etc/mysql/mariadb.conf.d/50-server.cnf

[mariadb]	<- 이거는 추가하는거 아님 (109번 라인에 있음)
 log-bin
 server_id=1 #마스터와 슬레이브의 숫자가 달라야함
 log-basename=master1
 binlog-format=mixed

확인

show master status;

master 서버에 slave사용자 추가 및 권한 설정

CREATE USER 'slave_user'@'%' IDENTIFIED BY 'qwer1234';
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%';
FLUSH PRIVILEGES;

SLAVE 설정

vi /etc/my.cnf.d/mariadb-server.cnf

[mariadb]	<- 이거는 추가하는거 아님
 server_id=2
 systemctl restart mariadb

server_id는 master와 다르게 해주어야한다.

mariadb -u root -p

CHANGE MASTER TO
MASTER_HOST='[Master 서버 IP]',
MASTER_USER='slave_user',
MASTER_PASSWORD='qwer1234',
MASTER_PORT=3306,
MASTER_LOG_FILE='[마스터에서 show master status 했을 때 File 이름]',
MASTER_LOG_POS=[마스터에서 show master status 했을 때 position 번호],
MASTER_CONNECT_RETRY=10;

START SLAVE;

확인

SHOW SLAVE STATUS\G

핫사이트 (KEEPALIVEd)

공통

설치

apt install -y keepalived

MASTER

vi /etc/keepalived/keepalived.conf

global_defs {
	router_id node01 #router_id는 서로 다르게
	enable_script_security
	script_user root
}
vrrp_script track_mariadb {
	script "systemctl is-active mariadb"
	interval 5
	fall 4
	rise 2
}
vrrp_instance VRRP1 {
	state MASTER
	interface ens33
	virtual_router_id 101
	priority 200 # master 서버의 우선순위가 standby 서버의 우선순위보다 높아야한다.
	advert_int 1
	virtual_ipaddress {
    	10.10.10.200/24
	}
	track_script {
    	track_mariadb 
	}
}

STANDBY

vi /etc/keepalived/keepalived.conf

global_defs {
	router_id node02 #router_id는 서로 다르게
	enable_script_security
	script_user root
}
vrrp_script track_mariadb {
	script "systemctl is-active mariadb"
	interval 5
	fall 4
	rise 2
}
vrrp_instance VRRP1 {
	state BACKUP
	interface ens33
	virtual_router_id 101
	priority 100
	advert_int 1
	virtual_ipaddress {
    	10.10.10.200/24
	}
	track_script {
    	track_mariadb 
	}
}

WAS

웹 서버 : 정적인 컨텐츠(HTML, CSS, JavaScript 파일 등)를 클라이언트에게 전달 (ex. Nginx, Apache등)
WAS : 동적인 컨텐츠를 생성하여 제공 (ex. Tomcat, JBoss, WebLogic, WebSphere 등)

TomCat

설치

우선 자바가 없으면 자바부터 설치

apt install -y openjdk-17-jdk

톰캣 다운로드

wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.33/bin/apache-tomcat-10.1.33.tar.gz

압축 해제

tar zxvf apache-tomcat-10.1.33.tar.gz

폴더 이동

mv apache-tomcat-10.1.33 /usr/local/tomcat10

원래 있던 건 지우고 새로운 JSP 코드 파일 생성

rm -rf /usr/local/tomcat10/webapps/ROOT/*
vi /usr/local/tomcat10/webapps/ROOT/db.jsp

<%@ page import="java.sql.*" %>
 <%
	String dbURL = "jdbc:mariadb://[DB서버 IP]:3306/web";
	String dbUser = "사용자 이름";
	String dbPassword = "비밀번호";
	Connection conn = null;
	try {
    	Class.forName("org.mariadb.jdbc.Driver");
    	conn = DriverManager.getConnection(dbURL, dbUser, dbPassword);
    	System.out.println("DB success!");
	} catch (Exception e) {
    	e.printStackTrace();
    	response.setContentType("text/html;charset=UTF-8");
        out.println("DB failed!");
	}
 %>

라이브러리 다운

cd /usr/local/tomcat10/lib
wget https://dlm.mariadb.com/3978472/Connectors/java/connector-java-3.5.1/mariadb-java-client-3.5.1.jar

톰캣 실행

/usr/local/tomcat10/bin/startup.sh

톰캣 종료

/usr/local/tomcat10/bin/shutdown.sh

실행 확인

ps -ef | grep /usr/bin/java
혹은
netstat -anlp | grep :8080

nginx, tomcat, mariadb 연결

nginx 와 tomcat 연결

vi /etc/nginx/sites-enabled/default

upstream tomcat_backend {
    server 10.10.10.20:8080; #tomcat 서버의 ip를 적어준다.
    server 10.10.10.30:8080;
}
server {
    listen 80 default_server;
    listen [::]:80 default_server;

	root /var/www/html;

	index index.html index.htm index.nginx-debian.html;
	server_name _;
	location / {
            try_files $uri $uri/ =404;
    }
	location /api {
		rewrite ^/api(/.*)$ $1 break;
    	proxy_pass http://tomcat_backend;  # 업스트림 그룹으로 프록시
    	proxy_set_header Host $host;
    	proxy_set_header X-Real-IP $remote_addr;
    	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    	proxy_set_header X-Forwarded-Proto $scheme;
    }
}

upstream tomcat_backend 부분에 tomcat ip와 포트번호를 적어주면 nginx와 tomcat의 연결이 완료된다.

tomcat과 mariadb의 연결

vi /usr/local/tomcat10/webapps/ROOT

해당 위치로 가면 nginx와 연결되었을 때
nginx서버의 아이피/api/파일이름 으로 jsp문서에 접근할 수 있게 된다.
(nginx에서 파일을 통해 접속할 때도 마찬가지)

db.jsp 파일 내부의 모습

0개의 댓글