[Linux] 3 Tier(On-premises)
온프레미스 환경에서 3티어 아키텍처 구현
3계층 아키텍쳐
아키텍쳐 종류
- 수직 분할형 아키텍쳐 : 역활별로 나눔
- 수평 분할형 아키텍쳐 : 같은 역할끼리 모아놓음
- 지리 분할형 아키텍쳐
실습
가상머신 생성
- haproxy 192.168.197.100
- httpd1 192.168.197.10
- httpd2 192.168.197.20
- was1 192.168.197.30
- was2 192.168.197.40
- db1 192.168.197.50
- db2 192.168.197.60
백업용 스냅샷 만들기
실습
아파치, 아파치 톰캣, DB 연동하기
아파치 서버 설정(http1 사용)
- 웹서버 설치
yum -y install httpd
- 방화벽 해제
systemctl stop firewalld systemctl disable firewalld setenforce 0
- 관련 패키지 및 모듈 설치
yum install -y httpd httpd-devel gcc gcc-c++ yum install -y wget wget https://dlcdn.apache.org/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.48-src.tar.gz
- 모듈 설치 ```shell tar zxvf tomcat-connectors-1.2.48-src.tar.gz 압축 풀고 cd tomcat-connectors-1.2.48-src/native/ 이동하고 ./configure –with-apxs=/usr/bin/apxs yum install -y make yum install -y redhat-rpm-config make
# tomcat-connectors-1.2.48-src/native/apache-2.0 밑에 mod_jk.so 생성됨
cd /apache-2.0
cp mod_jk.so /usr/lib64/httpd/modules/mod_jk.so
chmod 755 /usr/lib64/httpd/modules/mod_jk.so
4. 서버에서 모듈 적용 설정
``` shell
vi /etc/httpd/conf/httpd.conf 파일 60번 라인에 다음 내용 추가
LoadModule jk_module /usr/lib64/httpd/modules/mod_jk.so
<IfModule jk_module>
JkWorkersFile /etc/httpd/conf/workers.properties
JkLogFile /var/log/httpd/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkMount /*.jsp worker1
</IfModule>
- 워커 파일 생성
vi /etc/httpd/conf/workers.properties 파일 안에 다음 내용 작성 worker.list=worker1 worker.worker1.type=ajp13 worker.worker1.host=[톰캣의 IP] #지금 같은 경우는 was1의 아이피인 192.168.197.30 worker.worker1.port=8009
- 테스트 파일 생성 ``` shell vi /var/www/html/index.html
apache1 입력
7. 톰캣 설정 후 재시작.
#### 톰캣 서버 설정(was1 사용)
1. 방화벽 해제
```shell
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
- 설치
- JDK 설치 ```shell yum -y install java-1.8.0-openjdk-devel.x86_64
버전 확인
java -version
- 톰캣
``` shell
yum install -y wget
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.65/bin/apache-tomcat-9.0.65.tar.gz
tar zxvf apache-tomcat-9.0.65.tar.gz
mv apache-tomcat-9.0.65 /usr/local/tomcat9
- 톰캣 설정 ```shell vi /usr/local/tomcat9/conf/server.xml # 파일에서 153번 줄에 다음 내용 추가
121번 라인에 다음 내용 추가
<Connector protocol=”AJP/1.3” address=”0.0.0.0”| secretRequired=”false” port=”8009” redirectPort=”8443” />
/usr/local/tomcat9/webapps # 디렉토리 밑에 [이니셜] 디렉토리 생성
/usr/local/tomcat9/webapps/[이니셜] # 디렉토리 밑에 index.jsp 파일 생성
vi /usr/local/tomcat9/webapps/[이니셜]/index.jsp
파일에 다음 내용 작성 : test
4. 톰캣 서버 실행
```shell
/usr/local/tomcat9/bin/shutdown.sh
/usr/local/tomcat9/bin/startup.sh
- 톰캣 실행 확인 ```shell yum -y install net-tools netstat -anlp | grep :8080 netstat -anlp | grep :8009
6. 확인
내 아파치 서버 192.168.197.10/index.jsp에 들어갔을때, 톰캣에서 만든 index.jsp내용이 출력되어야 함
![image](/assets/img/image/aws3/2.png)
- httpd의 아이피를 입력했는데 was1의 있는 jsp파일의 내용이 나온다.
http에 jsp를 찾으면 jsp를 담당하는 곳으로 안내해준다.
#### DB 서버 설정(db1 사용)
1. 방화벽 해제
```shell
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
- mysql 설치 및 초기 설정 ```shell yum install -y mysql-server
systemctl restart mysqld
mysql_secure_installation
mysql -u root -p #mysql접속
```mysql
CREATE DATABASE [이니셜_db]; ex)CREATE DATABASE kjh_db;
CREATE USER '[이니셜]'@'%' IDENTIFIED BY '[DB 계정 패스워드]'; ex) CREATE USER 'kjh'@'%' IDENTIFIED BY 'qwer1234';
GRANT ALL PRIVILEGES ON [이니셜_db].* TO '[이니셜]'@'%'; ex) GRANT ALL PRIVILEGES ON kjh_db.* TO 'kjh'@'%';
FLUSH PRIVILEGES;
EXIT;
- DB 테이블 생성 ```mysql use kjh_db; CREATE TABLE student (sname VARCHAR(10), sage INT);
데이터 몇 개 넣기
INSERT INTO student VALUES(‘kim’,10); INSERT INTO student VALUES(‘lee’,20); INSERT INTO student VALUES(‘park’,30); INSERT INTO student VALUES(‘sim’,40);
4. 톰캣이랑 DB연동하기
- 톰캣서버(was1)에서
```shell
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.19.tar.gz
# 압축, 아카이브 해제
tar zxvf mysql-connector-java-8.0.19.tar.gz
# 내용물 복사
cd mysql-connector-java-8.0.19
cp mysql-connector-java-8.0.19.jar /usr/local/tomcat9/lib/
#톰캣 재시작
/usr/local/tomcat9/bin/shutdown.sh
/usr/local/tomcat9/bin/startup.sh
- 최종 확인
- 톰캣서버(was1)에 JSP생성
vi /usr/local/tomcat9/webapps/kjh/kjh_db.jsp
- 톰캣서버(was1)에 JSP생성
<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Connection conn = null;
ResultSet rs = null;
String url = "jdbc:mysql://[DB 서버 IP]:3306/[이니셜_db]?serverTimezone=UTC";
String id = "[이니셜]";
String pwd = "[DB 비번]";
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, id, pwd);
Statement stmt = conn.createStatement();
String sql = "SELECT sname FROM student";
rs = stmt.executeQuery(sql);
while(rs.next()) {
out.println(rs.getString("sname"));
}
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
%>
</body>
</html>
다음과 같이 DB내용이 출력된다.
톰캣 여러대 쓰기(was2 사용)
-
톰캣 설정 was1과 같이 준비를한다.
-
아파치 서버 설정(http1)
- 워커 파일 설정 수정
vi /etc/httpd/conf/httpd.conf
다음과 같이 파일내용을 worker1에서 loadbalace로 변경한다.
- 워커 파일 설정 수정
- 워커 파일 변경 ```shell vi /etc/httpd/conf/workers.properties
worker.list=tomcat1,tomcat2,loadbalance
worker.tomcat1.type=ajp13 worker.tomcat1.host=[톰캣1의 IP] worker.tomcat1.port=8009 worker.tomcat1.lbfactor=1
worker.tomcat2.type=ajp13 worker.tomcat2.host=[톰캣2의 IP] worker.tomcat2.port=8009 worker.tomcat2.lbfactor=1
worker.loadbalance.type=lb worker.loadbalance.balance_workers=tomcat1,tomcat2
2. 톰캣 설정
- 웹페이지 설정 (was1,was2)
```shell
vi /usr/local/tomcat9/webapps/kjh/test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page import="java.net.InetAddress" %>
클라이언트 IP <%=request.getRemoteAddr()%><br>
요청URI <%=request.getRequestURI()%><br>
요청URL: <%=request.getRequestURL()%><br>
서버이름 <%=request.getServerName()%><br>
<%
InetAddress inet= InetAddress.getLocalHost();
%>
동작 서버 IP <%=inet.getHostAddress()%><br>
서버포트 <%=request.getServerPort()%><br>
DB여러대 쓰기(db2 이용)
- DB서버 이중화
- 보조 DB설정 (db2)
#방화벽 제거
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
#mysql다운
yum install -y mysql-server
systemctl restart mysqld
mysql_secure_installation
- 마스터 DB설정(db1)
/etc/my.cnf.d/mysql-server.cnf
```cnf
#내용 뒤에 추가 server-id = 1 log-bin = mysql-bin
systemctl restart mysqld
3. 마스터 상태 확인
```shell
mysql -u root -p #로그인
show master status;
CREATE USER 'slave_user'@'%' IDENTIFIED BY 'qwer1234';
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%';
select * from mysql.user where user='slave_user'\G
- 데이터 백업(db1) ```shell mysql -u root -p mysqldump -u root -p –databases [이니셜_db] #현재 데이터를 슬레이브에 옮긴다.
scp back.sql [slave db 서버 ip]:/root/back.sql #백업파일을 db2에 옮긴다.
5. 슬레이브 DB설정이 끝나면
```shell
mysql -u root -p
UNLOCK TABLES;
- 슬레이브 DB설정
- 파일설정 ```shell /etc/my.cnf.d/mysql-server.cnf #파일 설정
server-id = 2 # 내용 추가 systemctl restart mysqld
- 데이터복구
```shell
mysql -u root -p < back.sql
- MASTER지정
change master to master_host='192.168.197.50', master_user='slave_user', master_password='qwer1234', master_log_file='binlog.000001', master_log_pos=4165;
- master_log_file, master_log_pos 확인
show master status; #master_log_pos는 쓸때마다 바뀌니 MASTER지정할때 해주자
- 동기화 시작
start slave;
- 슬레이브 상태 확인
show slave status\G
- 확인
- 마스터 DB에 정보 저장
mysql -u root -p use [이니셜_db]; INSERT INTO student VALUES('abcd',123); #데이터 아무거나 입력
- 슬레이브에서 데이터 확인
mysql -u root -p use [이니셜_db]; SELECT * FROM student;
최종확인
- 마스터 DB에 정보 저장
- 정보를 입력하면 db에 저장되는 웹사이트를 만들어보자
- http 웹서버 만들기(http1)
vi /var/www/html/insert.html
```html <!DOCTYPE html>
학생 정보 입력
2. jsp에 웹서버를 만들어 준다.(was1, was2)
```shell
vi /usr/local/tomcat9/webapps/kjh/insert.jsp
<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Connection conn = null;
String url = "jdbc:mysql://[DB 서버 IP]:3306/[이니셜_db]?serverTimezone=UTC";
String id = "[이니셜]";
String pwd = "[DB 비번]";
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, id, pwd);
Statement stmt = conn.createStatement();
request.setCharacterEncoding("utf-8");
String sname = request.getParameter("sname");
String sage = request.getParameter("sage");
String sql = "INSERT INTO student VALUES('"+sname+"',"+sage+")";
int result = stmt.executeUpdate(sql);
if (result == 1) {
out.println("성공");
} else {
out.println("실패");
}
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
%>
</body>
- 확인
http://192.168.197.10/insert.html 접속
저장을 눌러본다.
정보가 입력되면 안에 입력해 놓은 코드가 작동되기 때문에 jsp파일로 전환이 된다.
slave 서버인 db2에서 입력한 결과 성공적으로 입력이 된걸 확인 할 수 있다.