Naver Cloud Platform을 사용하여 Apache 2.4 + Tomcat 8 + MySQL 5.7 구성 및 Load Balancer 를 통해 이중화 설정까지 진행해보았다.
진행 과정
- 기본적인 3tier 구성
- 내 서버 이미지를 사용하여 똑같은 WEB, WAS 서버 생성
- LoadBalancer 구성
- 전체적인 연결 구성 및 확인
VPC
VPC 생성
vpc IP 대역 : 192.168.0.0/16
Subnet
lb_subnet : 192.168.101.0/24 (private)
public_subnet : 192.168.100.0/24 (server용 subnet)
** 기본 서버 설정 **
WEB Server (apache)
Init Script 사용
#!/bin/bash
yum update -y
yum install httpd -y
echo $(hostname -I) > /var/www/html/index.html //현재 서버의 IP를 index 파일에 저장
systemctl enable --now httpd
Server 생성
OS : CentOS 7.8
Type : [HighCPU] vCPU 2개, Mem 4GB
ACG 설정
Inbound
- 허용 포트 : 80-8080 보다는 필요한 포트만 개별적으로 open 하는 것이 보안상 안전하다.
- HTTP : 80
HTTPS : 443
Tomcat : 8080, 8009
MySQL : 3306 ( DB port 도 기본 포트인 3306이 아닌 다른 포트 번호를 부여하여 open 해주는 것이 안전. )
Outbound
확인
위에서 생성한 index.html 페이지가 뜨는지 확인.
<WEB_server_PublicIP>:80
WAS Server (tomcat)
Server 생성
OS : CentOS 7.8
Type : [HighCPU] vCPU 2개, Mem 4GB
ACG 설정
Inbound
- 허용 포트 : 80-8080 보다는 필요한 포트만 개별적으로 open 하는 것이 보안상 안전하다.
- HTTP : 80
HTTPS : 443
Tomcat : 8080, 8009
MySQL : 3306 ( DB port 도 기본 포트인 3306이 아닌 다른 포트 번호를 부여하여 open 해주는 것이 안전. )
Outbound
Tomcat 설정
JDK 설치
// 설치되어있는 openjdk 패키지가 있는지 확인
yum list installed | grep openjdk
// jdk 패키지 설치
yum install java-1.8.0-openjdk-devel.x86_64 -y
JDK 환경변수 설정
- vi /etc/profile
// 최하단에 추가
// 확인하고 붙여넣기!!
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64
export JAVA_HOME
PATH=$PATH:$JAVA_HOME/bin
export PATH
// 설정 적용
source /etc/profile
Tomcat 설정
wget https://downloads.apache.org/tomcat/tomcat-8/v8.5.65/bin/apache-tomcat-8.5.65.tar.gz
tar xvfz apache-tomcat-8.5.65.tar.gz
mv apache-tomcat-8.5.65 /usr/local/tomcat8
/usr/local/tomcat8/bin/shutdown.sh
/usr/local/tomcat8/bin/startup.sh
- wget 으로 tomcat이 설치 되지 않는다면 버전 문제일 수 있으므로 아래의 링크 참조.
https://tomcat.apache.org/download-80.cgi
확인
Tomcat 기본 페이지가 뜨는지 확인.
<WAS_server_Publicip>:8080
DB Server
Server 생성
OS : CentOS 7.8
Type : [HighCPU] vCPU 2개, Mem 4GB
ACG 설정
Inbound
- 허용 포트 : 80-8080 보다는 필요한 포트만 개별적으로 open 하는 것이 보안상 안전하다.
- HTTP : 80
HTTPS : 443
Tomcat : 8080, 8009
MySQL : 3306 ( DB port 도 기본 포트인 3306이 아닌 다른 포트 번호를 부여하여 open 해주는 것이 안전. )
Outbound
MySQL 설정
MySQL설치
// 패키지 설치
wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
yum localinstall mysql57-community-release-el7-11.noarch.rpm -y
//설치 후 repository 활성화
yum repolist enabled | grep "mysql.* -community.*"
// MySQL 설치
yum install -y mysql-community-server
// MySQL 시작
systemctl enable mysqld
systemctl start mysqld
MySQL 임시 패스워드 확인
패키지 설치 시 root 패스워드가 임의로 지정된다.
grep 'temporary password' /var/log/mysqld.log
MySQL Secure 설정
mysql_secure_installation
- 위에서 복사한 패스워드 사용.
my.cnf 파일 수정
- vi /etc/my.cnf
[client]
default-character-set = utf8
[mysql]
default-character-set = utf8
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
character-set-server = utf8
collation-server = utf8_general_ci
init_connect=SET collation_connection = utf8_general_ci
init_connect=SET NAMES utf8
character-set-client-handshake = FALSE
skip-character-set-client-handshake
systemctl restart mysqld // 재시작을 안하고 데이터를 저장하게 되면 꼬일 수 있음.
mysql -u root -p
mysql> status // mysql 접속 후 status 명령어로 수정된 내용 확인 가능!
접근 권한 부여
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '패스워드' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
접속하여 database 및 table 생성
// Database 및 Table 생성
mysql> create database tom_db;
mysql> grant all on tom_db.* to root@localhost identified by '[패스워드]';
mysql> use tom_db;
mysql> create table Users (id int(3) primary key, name varchar(20), email varchar(20), country varchar(20), password varchar(20));
mysql> INSERT INTO Users (id, name, email, country, password) VALUES (1, 'Harry', 'potter@apple.com', 'India', 'jinie123');
mysql> INSERT INTO Users (id, name, email, country, password) VALUES (4, 'Ronald', 'wisley@gmail.com', 'USA', 'herm23');
mysql> INSERT INTO Users (id, name, email, country, password) VALUES(5, 'Hermione', 'granger@google.com', 'UK', 'ron123');
mysql> flush privileges;
mysql> quit
// mysql 재시작
systemctl restart mysqld
** 연결 **
WEB(apache)과 WAS(tomcat) 연동
- 방화벽, Selinux 아예 끄고 시작.
systemctl stop firewalld
setenforce 0
WEB 설정
관련 패키지 및 모듈 설치
yum install httpd-devel gcc gcc-c++ -y
// mod_jk 사용
wget https://downloads.apache.org/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.48-src.tar.gz
- tomcat-connector 설치 링크 및 docs 참고
https://tomcat.apache.org/download-connectors.cgi
https://tomcat.apache.org/connectors-doc/
tomcat-connector 설정
tar xvfz tomcat-connectors-1.2.48-src.tar.gz
cd tomcat-connectors-1.2.48-src/native/
./configure --with-apxs=/bin/apxs
make
make install
// 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
web에서 모듈 적용 설정
- jk_module
- jk_module이란 이름으로 모듈을 불러옴
- jk_module이란 모듈이 있으면 iModule 진행
- 특정 웹 페이지에 일할 장치들을 지정하는 모듈.
- vi /etc/httpd/conf/httpd.conf
58 LoadModule jk_module modules/mod_jk.so
// 경로 설정 주의!!!
// modules/mod_jk.so (상대) = /etc/httpd/modules/mod_jk.so (절대)
// etc/httpd/modules -> /usr/lib64/httpd/modules 로 심볼릭링크 연결됨.
<IfModule jk_module>
JkWorkersFile /etc/httpd/conf/workers.properties // worker 지정
JkLogFile /var/log/httpd/mod_jk.log // log 저장될 곳
JkLogLevel info // info level이상의 log를 저장
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]" //log 형식
JkMount /*.jsp workerweb
JKMount /*.css workerweb
JKMount /*.svg workerweb
JKMount /*.png workerweb
JKMount /*.gif workerweb
JkMount /*.js workerweb
JKMount /*.do workerweb
</IfModule>
workers.properties 파일 설정
- vi /etc/httpd/conf/workers.properties
worker.list=workerweb
worker.workerweb.type=ajp13
worker.workerweb.host=[tomcat 서버의 IP]
worker.workerweb.port=8009
httpd 재시작
systemctl restart httpd
WAS 설정
- vi /usr/local/tomcat8/conf/server.xml
// 주석 해제
<Connector protocol="AJP/1.3"
address="0.0.0.0"
secretRequired="false" // SSL OF F
port="8009" // 웹서버 worker에 설정한 포트
redirectPort="8443" />
// tomcat 실행
/usr/local/tomcat8/bin/shutdown.sh
/usr/local/tomcat8/bin/startup.sh
// tomcat 실행 확인
netstat -anlp | grep :8080
MySQL 연동
WAS 설정
MySQL과 연동하기 위한 connector 설치 -JDBC Dirver
yum -y install mysql-connector-java
// 설치 위치 확인
rpm -ql mysql-connector-java
cp /usr/share/java/mysql-connector-java.jar /usr/local/tomcat8/lib/
MySQL 연동 테스트 페이지 생성
- vi /usr/local/tomcat8/webapps/ROOT/dbtest.jsp
<%@ page import="java.sql.*" contentType="text/html; charset=UTF-8" %>
<%
String DB_URL = "jdbc:mysql://[DB_Server_IP]/mysql";
String DB_USER = "root";
String DB_PASSWORD= "[암호]";
Connection conn;
Statement stmt;
try
{
Class.forName("org.gjt.mm.mysql.Driver");
conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
stmt = conn.createStatement();
conn.close();
out.println("MySQL Connection Success!");
}
catch(Exception e)
{
out.println(e.getMessage());
}
%>
-> http://[WEB_Server_ip]/dbtest.jsp 로 접속했을 때 MySQL Connection Success! 출력되야함.
생성한 데이터 불러내는 페이지 생성
- vi /usr/local/tomcat8/webapps/ROOT/dbdata.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_Server_IP]:3306/tom_db";
String id = "root";
String pwd = "[암호]";
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, id, pwd);
Statement stmt = conn.createStatement();
String sql = "SELECT * FROM Users";
rs = stmt.executeQuery(sql);
while(rs.next()) {
out.println("NAME - " +rs.getString("name")+ " |");
out.println("EMAIL - " +rs.getString("email")+ " |");
out.println("COUNTRY - " +rs.getString("country")+ " |");
out.println("<hr>");
}
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
%>
</body>
</html>
** 이중화 구현 **
Server Image
서버 관리 및 설정 변경 > 내 서버 이미지 생성 을 통해 현재 구성된 WEB, WAS와 동일한 서버를 생성.
- 서버 관리 및 설정 변경 > 내 서버 이미지 생성
- Server > Server Image 이동
- 생성된 이미지를 선택하여 서버 생성
Load Balancer
Target Group이 생성되어있어야한다.
Target Group
web roundrobin
was roundrobin
Load Balancer
Application Load Balancer 생성
- Network : Public IP
- 대상 VPC : vpc
- 서브넷 선택 : KR-2 lb-subnet
- 리스너 설정
- HTTP 80
- Target Group : web-tg
Network Load Balancer를 생성하기 전, Application Load Balancer의 접속 정보를 통해 웹 서버의 roundrobin이 잘 이루어지는지 확인한다.
Network Load Balancer 생성
- Network : Private IP
- 대상 VPC : vpc
- 서브넷 선택 : KR-2 lb-subnet
- 리스너 설정
- TCP 8009
- Target Group : was-tg
WEB 설정 변경
- vi /etc/httpd/conf/workers.properties
worker.list=workerweb
worker.workerweb.type=ajp13
worker.workerweb.host=[Network_Load_Balancer_IP]
worker.workerweb.port=8009
- httpd 재시작
systemctl restart httpd
확인
Load Balancer를 통해 2개의 was 서버에 접속되는지 확인을 위해 was 서버의 /usr/local/tomcat8/webapps/ROOT/dbdata.jsp 파일을 다르게 수정하여 비교해본다.
제일 상단의 Applicaion Load Balancer의 접속 정보 도메인 혹은 IP를 통해 접근
http://[Application_Load_Balancer_IP]/dbdata.jsp
새로 고침을 눌러 번갈아가며 접속이 되는지 확인한다.
'Public Cloud > NCP' 카테고리의 다른 글
Cloud Insight - 특정 process 다운 알람 (PLUGIN_PROCESS) (0) | 2023.01.03 |
---|
댓글