본문 바로가기
Public Cloud/NCP

[3tier 구성] NCP를 활용한 WEB-WAS-DB 연동

by shinebee* 2021. 4. 15.

Naver Cloud Platform을 사용하여 Apache 2.4 + Tomcat 8 + MySQL 5.7 구성 및 Load Balancer 를 통해 이중화 설정까지 진행해보았다.

 


진행 과정

  1. 기본적인 3tier 구성
  2. 내 서버 이미지를 사용하여 똑같은 WEB, WAS 서버 생성
  3. LoadBalancer 구성
  4. 전체적인 연결 구성 및 확인

 

 

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와 동일한 서버를 생성.

  1. 서버 관리 및 설정 변경 > 내 서버 이미지 생성
  2. Server > Server Image 이동
  3. 생성된 이미지를 선택하여 서버 생성

 

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

댓글